搜尋
首頁系統教程Linux如何在Linux下使用JNI呼叫C/C++程式碼

如何在Linux下使用JNI呼叫C/C++程式碼

Feb 13, 2024 pm 03:30 PM
linuxlinux教程linux系統linux指令shell腳本嵌入式linuxlinux入門linux學習

你是否想過在Java程式中使用C或C 的功能?你是否知道JNI是什麼,以及它如何讓你在Linux下實現跨語言程式設計?如果你對這些問題有興趣,那麼本文就是為你準備的。本文將介紹JNI的基本概念,以及如何在Linux下使用JNI呼叫C/C 程式碼的步驟和範例。

如何在Linux下使用JNI呼叫C/C++程式碼

#定義一個 Java 類別 — Hello類別

 public class Hello 
 { 
  static 
  { 
   try 
   { 
 // 此处即为本地方法所在链接库名
    System.loadLibrary("hello"); 
   } 
   catch(UnsatisfiedLinkError e) 
   { 
    System.err.println( "Cannot load hello library:\n " + 
                                e.toString() ); 
   } 
  } 
  public Hello() 
  { 
  } 
 // 声明的本地方法
   public native void SayHello(String strName); 
 }

這裡有兩個注意事項:

首先:為要使用的每個本機方法編寫本機方法聲明,只是必須指定 native 關鍵字,如下所示:

public native void SayHello(String strName);

其次:必須明確地載入本機程式碼庫。我們需在類別的靜態區塊中載入這個函式庫(靜態函式庫在類別載入時候就會呼叫)

現在我們來編輯hello.java以產生hello.class檔。

產生本機連結庫

#要為上述定義的類別產生 Java 本機介面頭文件,需使用 javah,Java 編譯器的 javah 功能將根據 Hello 類別產生必要的聲明,此命令將產生 Hello.h 檔案

產生的 Hello.h 檔案 內容如下所示:

 #include  
 /* Header for class Hello */ 
 #ifndef _Included_Hello 
 #define _Included_Hello 
 #ifdef __cplusplus 
 extern "C" { 
 #endif 
 /* 
 * Class:     Hello 
 * Method:    SayHello 
 * Signature: (Ljava/lang/String;)V 
 */ 
 JNIEXPORT void JNICALL Java_Hello_SayHello 
  (JNIEnv *, jobject, jstring); 
 #ifdef __cplusplus 
 } 
 #endif 
 #endif

在與 Hello.h 相同的路徑下建立一個 CPP 檔案 Hello.cpp

內容如下:

#include "Hello.h"
 #include  
 // 与 Hello.h 中函数声明相同
 JNIEXPORT void JNICALL Java_Hello_SayHello  (JNIEnv * env, jobject arg, jstring instring) 
 { 
   // 从 instring 字符串取得指向字符串 UTF 编码的指针
 const jbyte *str = 
        (const jbyte *)env->GetStringUTFChars( instring, JNI_FALSE ); 
    printf("Hello,%s\n",str); 
  // 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。
    env->ReleaseStringUTFChars( instring, (const char *)str ); 
    return; 
 }

這裡有三個參數,下面要講一下參數用法:

(1)所有的 JNI 呼叫都使用了 JNIEnv * 類型的指針,習慣上在 CPP 檔案中將這個變數定義為 evn,它是任意一個本地方法的第一個參數。 env 指標指向一個函數指標表,在 VC 中可以直接用”->”操作符存取其中的函數。
(2)jobject 指向在此 Java 程式碼中實例化的 Java 物件 LocalFunction 的一個句柄,相當於 this 指標。
(3)第三個參數就是本地呼叫中有 Java 程式傳進的參數,本例只有一個 String 型參數。對於字串型參數,因為在本機程式碼中無法直接讀取 Java 字串,而必須將其轉換為 C /C 字串或 Unicode。

編譯產生共享函式庫。

#使用 GCC 時 , 必須通知編譯器在何處查找此 Java 本地方法的支援文件,並且明確通知編譯器生成位置無關的程式碼,在我的環境中按如下程序編譯:

gcc -I/home/jbuilder/jdk1.3.1/include 
    -I/home/jbuilder/jdk1.3.1/include/linux -fPIC -c Hello.c

產生 Hello.o

gcc -shared -Wl,-soname,libhello.so -o libhello.so Hello.o

產生 libhello.so(這就是linux下動態連結函式庫的檔名格式,就像windows下是.dll檔後綴名類似)

最後通知動態連結程式此共用檔案的路徑。

export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH

寫一個簡單的 Java 程式來測試我們的本機方法

#將以下原始碼存為 A.java:

 import Hello; 
 import java.util.*; 
 public class A 
 { 
  public static void main(String argv[]) 
  { 
   A a = new A(); 
  } 
  public A() 
  { 
   Hello h = new Hello(); 
   // 调用本地方法
   h.SayHello("Hello world");    
  } 
 }

用 javac 編譯A.java,產生A.class
向執行普通 Java 程式一樣使用 java A,我們會看到在螢幕上出現 Hello world。
透過本文,你應該對JNI有了一個初步的了解,以及如何在Linux下使用JNI呼叫C/C 程式碼的方法。 JNI是一個強大且靈活的工具,它可以讓你在Java程式中利用C/C 的優勢,或是在C/C 程式中利用Java的優勢。當然,JNI也有一些缺點,例如效能損耗,記憶體洩漏,錯誤處理等。因此,在使用JNI時,你需要注意一些細節和規範,以確保程式碼的正確性和安全性。希望這篇文章能對你有所幫助,如果你有任何疑問或建議,請在評論區留言。

以上是如何在Linux下使用JNI呼叫C/C++程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:良许Linux教程网。如有侵權,請聯絡admin@php.cn刪除
Linux的主要目的是什麼?Linux的主要目的是什麼?Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

互聯網在Linux上運行嗎?互聯網在Linux上運行嗎?Apr 14, 2025 am 12:03 AM

互聯網運行不依賴單一操作系統,但Linux在其中扮演重要角色。 Linux廣泛應用於服務器和網絡設備,因其穩定性、安全性和可擴展性受歡迎。

Linux操作是什麼?Linux操作是什麼?Apr 13, 2025 am 12:20 AM

Linux操作系統的核心是其命令行界面,通過命令行可以執行各種操作。 1.文件和目錄操作使用ls、cd、mkdir、rm等命令管理文件和目錄。 2.用戶和權限管理通過useradd、passwd、chmod等命令確保系統安全和資源分配。 3.進程管理使用ps、kill等命令監控和控制系統進程。 4.網絡操作包括ping、ifconfig、ssh等命令配置和管理網絡連接。 5.系統監控和維護通過top、df、du等命令了解系統運行狀態和資源使用情況。

使用Linux別名提高自定義命令快捷方式的生產率使用Linux別名提高自定義命令快捷方式的生產率Apr 12, 2025 am 11:43 AM

介紹 Linux是一個強大的操作系統,由於其靈活性和效率,開發人員,系統管理員和電源用戶都喜歡。但是,經常使用長而復雜的命令可能是乏味的

Linux實際上有什麼好處?Linux實際上有什麼好處?Apr 12, 2025 am 12:20 AM

Linux適用於服務器、開發環境和嵌入式系統。 1.作為服務器操作系統,Linux穩定高效,常用於部署高並發應用。 2.作為開發環境,Linux提供高效的命令行工具和包管理系統,提升開發效率。 3.在嵌入式系統中,Linux輕量且可定制,適合資源有限的環境。

在Linux上掌握道德黑客的基本工具和框架在Linux上掌握道德黑客的基本工具和框架Apr 11, 2025 am 09:11 AM

簡介:通過基於Linux的道德黑客攻擊數字邊界 在我們越來越相互聯繫的世界中,網絡安全至關重要。 道德黑客入侵和滲透測試對於主動識別和減輕脆弱性至關重要

如何學習Linux基礎知識?如何學習Linux基礎知識?Apr 10, 2025 am 09:32 AM

Linux基礎學習從零開始的方法包括:1.了解文件系統和命令行界面,2.掌握基本命令如ls、cd、mkdir,3.學習文件操作,如創建和編輯文件,4.探索高級用法如管道和grep命令,5.掌握調試技巧和性能優化,6.通過實踐和探索不斷提陞技能。

Linux最有用的是什麼?Linux最有用的是什麼?Apr 09, 2025 am 12:02 AM

Linux在服務器、嵌入式系統和桌面環境中的應用廣泛。 1)在服務器領域,Linux因其穩定性和安全性成為託管網站、數據庫和應用的理想選擇。 2)在嵌入式系統中,Linux因其高度定制性和高效性而受歡迎。 3)在桌面環境中,Linux提供了多種桌面環境,滿足不同用戶需求。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用