1. 程式人生 > >linux下JNI開發—HelloWord為例

linux下JNI開發—HelloWord為例

轉自:https://www.cnblogs.com/snake-hand/archive/2012/05/25/2517412.html

前期準備:

1、Java JDK

2、gcc

3、g++

確保上述準備工作完成後開始下邊的工作:

Java程式碼:

public   class  Hello {  
    static  {  
        try  {  
            System.loadLibrary("HelloWord" );              
        } catch  (UnsatisfiedLinkError e) {  
            e.printStackTrace();  
        }  
    }  
      
    public  Hello() {};  
      
    public   native   void  SayHello(String strName);  
}

 

在終端輸入 javac Hello.java 後生成Hello.class 檔案

然後:javah Hello 生成 Hello.h檔案

 

然後在相同的目錄下新建一個Hello.cpp檔案:內容如下:

#include "Hello.h"   
#include <stdio.h>   
// 與 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 ;  
}

 

編譯生成動態庫

gcc -I /usr/java/jdk1.8.0_73/include/ -I /usr/java/jdk1.8.0_73/include/linux/  Hello.cpp -fPIC -shared -o Hello.so

 注意

/usr/java/jdk1.8.0_73/include/
/usr/java/jdk1.8.0_73/include/linux/
這兩目錄根據自己的java jdk的安裝目錄而變。

所有檔案

Hello.class  Hello.cpp  Hello.h  Hello.java  Hello.so

 

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

export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH 

 

最後是java測試程式碼:

public   class  ToSay   
 {   
     public   static   void  main(String argv[])   
     {   
         ToSay say = new  ToSay();   
     }   
     public  ToSay()   
     {   
         Hello h = new  Hello();   
         // 呼叫本地方法向 John 問好   
         h.SayHello("John" );              
     }   
 }

 用 javac 編譯 ToSay.java,生成 ToSay.class 
向執行普通 Java 程式一樣使用 java ToSay,我們會看到在螢幕上出現 Hello,John。