JNI技術實現--Java調C/C++

廢話很少說,首先咱們來看Java調用C/C++步驟:java

    1.編寫Java代碼,在代碼中使用native關鍵字標明該方法是調用本地庫,不須要實現。ios

    2.使用javah -jni 命令,生成對應的頭文件,此步驟主要是規範化本地代碼,總所周知,Java是平臺無關的,可是C/C++是平臺相關的,因此須要規範本地代碼,使其表示的值與Java中的值意義相同。函數

    3.用C/C++實現頭文件中的接口函數,並把其編譯連接成動態連接庫,在環境變量設置動態庫路徑。測試

    4.在Java代碼中添加加載動態連接庫的代碼,並將其編譯爲class文件。spa

    5.運行並測試效果。code

example:blog

一、java代碼:Hello.java接口

 1 public class Hello {
 2 
 3     static {
 4         System.loadLibrary("hello");
 5     }
 6 
 7     public native static void hello(String s); //聲明本地庫函數
 8 
 9     public static void main(String[] args) {
10         hello("hello");
11         for(String s : args) hello(s);
12     }
13 }

 

二、使用 javah -jni Hello 命令生成  Hello.hstring

 1 /* DO NOT EDIT THIS FILE - it is machine generated */
 2 #include <jni.h>
 3 /* Header for class Hello */
 4 
 5 #ifndef _Included_Hello
 6 #define _Included_Hello
 7 #ifdef __cplusplus
 8 extern "C" {
 9 #endif
10 /*
11  * Class:     Hello
12  * Method:    hello
13  * Signature: (Ljava/lang/String;)V
14  */
15 JNIEXPORT void JNICALL Java_Hello_hello
16   (JNIEnv *, jclass, jstring);
17 
18 #ifdef __cplusplus
19 }
20 #endif
21 #endif

 

三、實現頭文件 Hello.h 中的函數  JNIEXPORT void JNICALL Java_Hello_hello(JNIEnv *, jclass, jstring);it

新建cpp文件 Hello.cpp  內容以下:

 1 #include <jni.h>
 2 #include"Hello.h"
 3 #include<iostream>
 4 using namespace std;
 5 JNIEXPORT void JNICALL Java_Hello_hello (JNIEnv* env, jclass jc, jstring s)
 6 {
 7     const char* str = env->GetStringUTFChars(s, 0);
 8     cout << str << endl;
 9     env->ReleaseStringUTFChars(s, str);
10 }

將 Hello.cpp 編譯成動態庫 libhello.so:g++ -fPIC -shared -IXXX_jni -IXXX_jni_md Hello.cpp -o libhello.so  其中 XXX_jni 爲jni.h的路徑, XXX_jni_md 爲 jni_md.h 的路徑

四、編譯 Hello.java : javac Hello.java   生成 Hello.class   最好還要添加 libhello.so 路徑到環境變量才能運行。

五、運行結果:

相關文章
相關標籤/搜索