配置JNI : https://blog.csdn.net/shao15232/article/details/102500277
配置好JNI後我們來建立一個簡單的demo,實作so庫的生成和調用。
我們先建立一個demo。
打開Android stdio然後建立一個空白demo
然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。
完成後就進入Android stdio的編碼界面了。然後右鍵app,new一個jni的檔案夾。
直接點Finish。這個時候 這個JNI檔案夾就出來了。如下圖:
接下來我們需要在mainActivity中建立一個類,用來銜接Java和C語言。如下圖
在彈出的對話框中聲明我們要建立的類名。
完成後點選OK。
到這裡我們才完成一半的工作。
我們找到我們剛才添加的類。在右邊寫上下面的代碼。
1 用來加載我們生辰的so庫。
2 我們随便寫的一個用來測試的函數。
這個時候會提示我們GBK不認識。那麼我們設定一下UTF-8就好了。
具體做法如下: -encoding UTF-8 這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。
注意一定不要點開黃色的兩個箭頭添加,會出錯。
到這裡給我們的jniInterface class添加頭檔案。
如下圖:右鍵jniInterface選擇javah
這個時候打開jni檔案夾能看到我們添加的頭檔案。
接下來我們找到這個頭檔案的存儲目錄,并添加三個檔案。如下圖:
在這個檔案中添加如圖三個檔案,名字分别為:Android.mk Application.mk JNI.cpp
然後再這三個檔案中添加源碼。
Android.mk 源碼:
LOCAL_PATH := $(call my-dir) #擷取Android.mk所在目錄
include $(CLEAR_VARS)
# 下面一句是用來指定so庫生成位置的,感興趣的朋友可以試試,确實可以改變so庫生成位置。
# NDK_APP_DST_DIR=../../../../../SharedLibs/$(TARGET_ARCH_ABI)
LOCAL_MODULE := jniTest #指定生成so庫的名稱
LOCAL_SRC_FILES := JNI.cpp #指定生成so庫所需源碼檔案
include $(BUILD_SHARED_LIBRARY) #說明生成的是動态so庫(這句是廢話)
Application.mk 源碼:
# APP_ABI :=armeabi armeabi-v7a mips x86
APP_ABI :=armeabi-v7a #指定生成的so庫适用的cpu架構,這個是最常見的一種。
JNI.cpp 源碼:
#include"com_example_myapplication_jniInterface.h"
JNIEXPORT jstring JNICALL Java_com_example_myapplication_jniInterface_tw_1jniTest
(JNIEnv *env, jobject obj)
{
return env->NewStringUTF("TERAWINS");
}
到這裡jni設定差不多就完成了,我們現在需要用ndk-build來編譯一下我們剛才設定的jni,生成so庫。如下圖
右鍵jni檔案夾->NDK->ndk-build
這個時候可以發現,main目錄下面多了libs和obj。
下圖紅框就是我們生成的so庫。
做到這裡我們編譯一下,發現沒有錯誤。接着往下走。
我們找到layout->activity_main.xml 然後給我們的textView加個句柄。如下圖:
找到mainActivity,添加如下圖内容:
1 找到mainActivity檔案
2 導入TextView包
3 先聲明一個TextView tv 執行個體指向空。
4 讓tv 指向我們上一步設定的TW句柄。
5 把我們用jni設定的傳回字元串在tv指向的TextView中顯示出來。
這個時候編譯可以過但是app不能正常運作。
因為還有一個地方要設定:
在build.gradle中加入上圖中紅框的内容。屏蔽預設的庫調用路徑,使用我們剛生成的so庫的調用路徑。
為了設定so庫調用路徑。
最後設定成功,點選run.
app在我們的RK3288上面跑起來,效果如下圖: