廢話很少說,首先咱們來看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 路徑到環境變量才能運行。
五、運行結果: