天天看點

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

配置JNI : https://blog.csdn.net/shao15232/article/details/102500277

配置好JNI後我們來建立一個簡單的demo,實作so庫的生成和調用。

我們先建立一個demo。

打開Android stdio然後建立一個空白demo

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。

完成後就進入Android stdio的編碼界面了。然後右鍵app,new一個jni的檔案夾。

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。
RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

直接點Finish。這個時候  這個JNI檔案夾就出來了。如下圖:

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

接下來我們需要在mainActivity中建立一個類,用來銜接Java和C語言。如下圖

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

在彈出的對話框中聲明我們要建立的類名。

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

完成後點選OK。

到這裡我們才完成一半的工作。

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

我們找到我們剛才添加的類。在右邊寫上下面的代碼。

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

1 用來加載我們生辰的so庫。

2 我們随便寫的一個用來測試的函數。

這個時候會提示我們GBK不認識。那麼我們設定一下UTF-8就好了。

具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

注意一定不要點開黃色的兩個箭頭添加,會出錯。

到這裡給我們的jniInterface class添加頭檔案。

如下圖:右鍵jniInterface選擇javah

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

這個時候打開jni檔案夾能看到我們添加的頭檔案。

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

接下來我們找到這個頭檔案的存儲目錄,并添加三個檔案。如下圖:

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟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

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

這個時候可以發現,main目錄下面多了libs和obj。

下圖紅框就是我們生成的so庫。

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

做到這裡我們編譯一下,發現沒有錯誤。接着往下走。

我們找到layout->activity_main.xml  然後給我們的textView加個句柄。如下圖:

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

找到mainActivity,添加如下圖内容:

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

1 找到mainActivity檔案

2 導入TextView包

3 先聲明一個TextView tv 執行個體指向空。

4 讓tv 指向我們上一步設定的TW句柄。

5 把我們用jni設定的傳回字元串在tv指向的TextView中顯示出來。

這個時候編譯可以過但是app不能正常運作。

因為還有一個地方要設定:

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

在build.gradle中加入上圖中紅框的内容。屏蔽預設的庫調用路徑,使用我們剛生成的so庫的調用路徑。

為了設定so庫調用路徑。

最後設定成功,點選run.

app在我們的RK3288上面跑起來,效果如下圖:

RK3288 JNI實作so庫的生成與調用然後設定這個demo的存儲路徑,注意語言要選擇java。不要用推薦的kt。具體做法如下:  -encoding UTF-8  這句話放到下圖的地方。這句話一定要緊跟jni目錄後面,位置一定不能錯。

繼續閱讀