在網上有很多例子,使用的多是配置NDK,但是我按照那些例子一步一步走,也能編譯成功,但是結果就是生成不了NDK文件夾,也沒有.so庫.最終也沒能找到是什麼原因,但是在這裏看到了另外一種方法:https://blog.csdn.net/xiaoyunchengzhu/article/details/52982284,但是在使用的過程中,遇到的各種異常現在總結一下:
1.出現異常:unable to get the cmake version located xxx.
新建完成之後,提示一個沒有找到cmake版本的異常:unable to get the cmake version located xxx.
解決方法:到Setting中,下載CMake,默認下載的是最新版本的CMake
2.現在CMake成功之後提示異常:Error:Error occurred while communicating with CMake server
解決方法:選擇下載3.6.4111459的版本,我的是Android studio 3.0,一開始默認下載了一個最新版本是3.10的CMake ,最新版本會報這個異常:
Error:Error occurred while communicating with CMake server,我將3.10卸載了,換成3.6.4111459這個版本就OK了
異常解決之後,然後rebuild 項目在找到了夢寐以求的.so
3.在MainActivity中添加新的native方法,編譯沒有問題,但是在運行的時候,出現異常:
No implementation found for java.lang.String com.xxx.jnitestdemo2.MainActivity.getMyString()
然後在對應的cpp文件中,添加方法:
解決方法:
在extern "C"後面加上大括號{},然後將所有需要的方法,都放在大括號裏面,OK,成功獲取希望的結果
extern "C" {
JNIEXPORT jstring
JNICALL
Java_com_xxx_jnitestdemo2_MainActivity_stringFromJNI2(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++1";
return env->NewStringUTF(hello.c_str());
}
JNIEXPORT jstring
JNICALL Java_com_xxx_jnitestdemo2_MainActivity_getMyString(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello is my String";
return env->NewStringUTF(hello.c_str());
}
}