1. 程式人生 > >so文件(1)簡單的導出使用

so文件(1)簡單的導出使用

原因 selected line false plugin eset 規則 命名規則 建立

1.創建工程生成c++,包名為com.cc.test_socreator,內容:

技術分享圖片技術分享圖片?

此時可以在MainActivity中使用代碼調用stringFromJNI:

技術分享圖片技術分享圖片?

可以在jniTest中調用getString:

技術分享圖片技術分享圖片?

2.生成so文件

Build-make project在沒有報錯,工程建立以後會在build-intermediates-cmake-debug下生成so。

簽名以後就會生成release文件夾,release版本在其文件夾下面。

技術分享圖片技術分享圖片?

3.引入到工程

創建工程com.cc.test_socreator,在app-build.gradle下的android中增加五行代碼:

技術分享圖片技術分享圖片?

在該工程的默認MainActivity下使用,報錯:

java.lang.UnsatisfiedLinkError: No implementation found for java.lang.String com.cc.test_importso.MainActivity.stringFromJNI() (tried Java_com_cc_test_1importso_MainActivity_stringFromJNI and Java_com_cc_test_1importso_MainActivity_stringFromJNI__).

原因是jni在Android中的引用存在命名規則,比如函數名Java_com_cc_test_1importso_MainActivity_stringFromJNI,但是so文件中的函數名不是是第一個工程…test_1socreator…。

解決辦法是創建一個包名和so文件中的包名相同.

技術分享圖片技術分享圖片?

在jniTest中使用getString()方法,返回”nice to meet u”。

技術分享圖片技術分享圖片?

此時getString會報錯,因為該方法在so文件中,找不出來,但是不影響,可以編譯執行。

so文件(1)簡單的導出使用