如何在Linux下使用JNI呼叫C/C++程式碼
你是否想過在Java程式中使用C或C 的功能?你是否知道JNI是什麼,以及它如何讓你在Linux下實現跨語言程式設計?如果你對這些問題有興趣,那麼本文就是為你準備的。本文將介紹JNI的基本概念,以及如何在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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

CentOS 和 Ubuntu 的關鍵差異在於:起源(CentOS 源自 Red Hat,面向企業;Ubuntu 源自 Debian,面向個人)、包管理(CentOS 使用 yum,注重穩定;Ubuntu 使用 apt,更新頻率高)、支持週期(CentOS 提供 10 年支持,Ubuntu 提供 5 年 LTS 支持)、社區支持(CentOS 側重穩定,Ubuntu 提供廣泛教程和文檔)、用途(CentOS 偏向服務器,Ubuntu 適用於服務器和桌面),其他差異包括安裝精簡度(CentOS 精

CentOS 安裝步驟:下載 ISO 映像並刻錄可引導媒體;啟動並選擇安裝源;選擇語言和鍵盤佈局;配置網絡;分區硬盤;設置系統時鐘;創建 root 用戶;選擇軟件包;開始安裝;安裝完成後重啟並從硬盤啟動。

CentOS將於2024年停止維護,原因是其上游發行版RHEL 8已停止維護。該停更將影響CentOS 8系統,使其無法繼續接收更新。用戶應規劃遷移,建議選項包括CentOS Stream、AlmaLinux和Rocky Linux,以保持系統安全和穩定。

Docker利用Linux內核特性,提供高效、隔離的應用運行環境。其工作原理如下:1. 鏡像作為只讀模板,包含運行應用所需的一切;2. 聯合文件系統(UnionFS)層疊多個文件系統,只存儲差異部分,節省空間並加快速度;3. 守護進程管理鏡像和容器,客戶端用於交互;4. Namespaces和cgroups實現容器隔離和資源限制;5. 多種網絡模式支持容器互聯。理解這些核心概念,才能更好地利用Docker。

CentOS 已停止維護,替代選擇包括:1. Rocky Linux(兼容性最佳);2. AlmaLinux(與 CentOS 兼容);3. Ubuntu Server(需要配置);4. Red Hat Enterprise Linux(商業版,付費許可);5. Oracle Linux(與 CentOS 和 RHEL 兼容)。在遷移時,考慮因素有:兼容性、可用性、支持、成本和社區支持。

CentOS 停止維護後,用戶可以採取以下措施應對:選擇兼容髮行版:如 AlmaLinux、Rocky Linux、CentOS Stream。遷移到商業發行版:如 Red Hat Enterprise Linux、Oracle Linux。升級到 CentOS 9 Stream:滾動發行版,提供最新技術。選擇其他 Linux 發行版:如 Ubuntu、Debian。評估容器、虛擬機或云平台等其他選項。

如何使用 Docker Desktop? Docker Desktop 是一款工具,用於在本地機器上運行 Docker 容器。其使用步驟包括:1. 安裝 Docker Desktop;2. 啟動 Docker Desktop;3. 創建 Docker 鏡像(使用 Dockerfile);4. 構建 Docker 鏡像(使用 docker build);5. 運行 Docker 容器(使用 docker run)。

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)
