就是生產個so文件,並且可以調用C裏面的方法。但爲什麼要寫一篇滿論壇多的是的文章呢,就是因爲我踩了N多個坑,希望可以幫助大家,讓大家少走彎路。
先看一下效果圖
【1環境的搭建】
NDK沒有的可以去下載 :https://developer.android.com/ndk/downloads/index.html
添加完NDK 記得看一下這裏
接着看這裏
要加上這句代碼:android.useDeprecatedNdk=true 很重要!很重要!
【2 java類編寫的代碼】
public class JniTest {
static {
System.loadLibrary("jary");
}
public native String getString();
}
然後接着
之後你會發現生成了一個JniTest .class文件
【3 Terminal 命令】
cd 到mian 文件下 然後 輸入命令:javah -d jni -classpath 自己編譯後的 class 文件的絕對路徑
debug 後面是空格!debug 後面是空格!debug 後面是空格!
之後就會生成一個.h的文件
創建一個.c的文件,include後面的是生成.h文件的名字
裏面的(JNIEXPORT jstring JNICALL Java_com_example_lxndk_JniTest_getString)
是.h文件中方法(重寫一下)
#include"com_example_lxndk_JniTest.h"
JNIEXPORT jstring JNICALL Java_com_example_lxndk_JniTest_getString
(JNIEnv *env, jobject jobject1){
return (*env)->NewStringUTF(env,"Hello Jin =_=!");
}
然後–在 build.gradle defaultConfig 中添加如下代碼
ndk {
moduleName "jary" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種abi體系結構下的so庫。
}
到這裏的jni 調 C 就完成了,但是我想說的是!爲什麼會報這個錯???
然後我發現我貌似缺少了東西,Android.mk…
創建Android.mk文件
# 構建系統提供的宏函數 my-dir 將返回當前目錄(包含 Android.mk 文件本身的目錄)的路徑,基本上是固定的,不需要去動
LOCAL_PATH := $(call my-dir)
# 會清除很多 LOCAL_XXX 變量,不會清除 LOCAL_PATH,基本上是固定的,不需要去動
include $(CLEAR_VARS)
# 需要構建模塊的名稱,會自動生成相應的 libNDKSample.so 文件,每個模塊名稱必須唯一,且不含任何空格
LOCAL_MODULE := jary
# 包含要構建到模塊中的 C 或 C++ 源文件列表
LOCAL_SRC_FILES := jary.c
# 指定這個模塊裏會用到哪些原生 API,詳見:https://developer.android.google.cn/ndk/guides/stable_apis.html
LOCAL_LDLIBS := -llog
# 幫助系統將所有內容連接到一起,固定的,不需要去動
include $(BUILD_SHARED_LIBRARY)
要改成自己對應的.c 還有構建模塊的名稱
Application.mk
# 選擇不同的 ABI,多個使用空格作爲分隔符,全部是all
# APP_ABI := armeabi armeabi-v7a
APP_ABI := all
# 指定要使用的運行時
APP_STL := gnustl_static
最後在 build.gradle android 下 指定目錄!
運行效果
【4生成so文件】
到這裏才基本結束!
源碼地址:https://download.csdn.net/download/macaopark/10340231