初試JNI(ubuntu idea clion)
阿新 • • 發佈:2018-12-14
1. 安裝java
Ubuntu直接採用apt安裝,具體安裝步驟百度即得,或者終端輸入
java -version
根據提示進行安裝。
2. 安裝idea
3. 在idea建立java檔案:
public class JniExample { static { System.load("/root/IdeaProjects/JNItryagain/libtest32.so"); } public native String getStringFromC(); public static void main(String[] args){ System.out.println(new JniExample().getStringFromC()); } }
4. 生成.h檔案
點選build,會生成一個out資料夾,裡面包含jniExample.class,開啟終端在包含jniExample.class的路徑下執行
javah JniExample
執行javah時,class檔案和java檔案不能放一起,詳情見上條部落格。
5.拷貝生成的jniExample.h到新建的clion專案。
開啟clion,生成一個新的專案,將剛剛生成的jniExample.h拷貝到這個專案中,同時也把j/usr/lib/jvm/java-8-openjdk-amd64/include下的jni.h,以及 /usr/lib/jvm/java-8-openjdk-amd64/include/linux
/* DO NOT EDIT THIS FILE - it is machine generated */ #include "jni.h" /* Header for class JniExample */ #ifndef _Included_JniExample #define _Included_JniExample #ifdef __cplusplus extern "C" { #endif /* * Class: JniExample * Method: getStringFromC * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_JniExample_getStringFromC (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
main.cpp
#include "JniExample.h"
JNIEXPORT jstring JNICALL Java_JniExample_getStringFromC(JNIEnv *env, jobject thisObj) {
return (env)->NewStringUTF("hello from libtestcpp");
}
CMakeLists.txt.
6. 生成.so檔案
gcc -m32 main.cpp JniExample.h jni.h jni_md.h -fPIC -shared -o libtestcpp32.so -lstdc++
-m32是生成32位的so檔案,-lstdc++ 表明編譯的是c++檔案。
若此時報錯 bits/c++config.h: No such file or directory,則需要安裝多版本編譯模式:
sudo apt-get install gcc-multilib g++-multilib
7. 拷貝so檔案
將生成的libtestcpp32.so檔案拷貝到idea的專案中,位置如下:
/root/IdeaProjects/JNItryagain/libtestcpp32.so
8. 執行結果
hello from libtestcpp
Process finished with exit code 0