目錄
#定義一個 Java 類別 — Hello類別" >#定義一個 Java 類別 — Hello類別
產生本機連結庫" >產生本機連結庫
在與 Hello.h 相同的路徑下建立一個 CPP 檔案 Hello.cpp" >在與 Hello.h 相同的路徑下建立一個 CPP 檔案 Hello.cpp
編譯產生共享函式庫。 " >編譯產生共享函式庫。
寫一個簡單的 Java 程式來測試我們的本機方法" >寫一個簡單的 Java 程式來測試我們的本機方法
首頁 系統教程 Linux 如何在Linux下使用JNI呼叫C/C++程式碼

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

Feb 13, 2024 pm 03:30 PM
linux linux教程 linux系統 linux指令 shell腳本 嵌入式linux linux入門 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱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.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

centos和ubuntu的區別 centos和ubuntu的區別 Apr 14, 2025 pm 09:09 PM

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

centos如何安裝 centos如何安裝 Apr 14, 2025 pm 09:03 PM

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

Centos停止維護2024 Centos停止維護2024 Apr 14, 2025 pm 08:39 PM

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

docker原理詳解 docker原理詳解 Apr 14, 2025 pm 11:57 PM

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

Centos停止維護後的選擇 Centos停止維護後的選擇 Apr 14, 2025 pm 08:51 PM

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

centos停止維護後怎麼辦 centos停止維護後怎麼辦 Apr 14, 2025 pm 08:48 PM

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

docker desktop怎麼用 docker desktop怎麼用 Apr 15, 2025 am 11:45 AM

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

vscode需要什麼電腦配置 vscode需要什麼電腦配置 Apr 15, 2025 pm 09:48 PM

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)

See all articles