android NDK JNI配置
!!!!!!!!!!!!!!!!!!!
首先配置好android SDK 以及JNI
使用编译器android sudo
!!!!!!!!!!!!!!!!!!!
新建项目-基础配置阶段一
-
新建项目 选择project视图
-
新建JNI
-
在文件夹中创建一个Android.mk文件 (就是jni所在路径的makefile)写入一下内容
LOCAL_PATH:=$(call my-dir) include $(CLEAR_VARS) #libtestjni.so LOCAL_MODULE := testjni LOCAL_SRC_FILES := test.cpp LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY)
-
在app的build.gradle中的android 范围内加入
sourceSets { main.jniLibs { //表示生产的so文件所在路径在什么位置 source { srcDirs = ['../libs'] } } }
-
删除 main { jni.srcDirs = [‘src/main/jni’, ‘…/JNI/’] }
-
在JNI中创建一个test.cpp
void testJni_Hello() { return; }
-
使用Windows PowerShell (win10自带工具)
cd JNI目录
ndk-build.cmd
运行示例:
PS C:\Users\Daidenghui> cd E:\02course\MyApplication\MyApplication09\JNI
PS E:\02course\MyApplication\MyApplication09\JNI> ndk-build.cmd
Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-14.
[arm64-v8a] Compile++ : testjni <= test.cpp
[arm64-v8a] StaticLibrary : libstdc++.a
[arm64-v8a] SharedLibrary : libtestjni.so
[arm64-v8a] Install : libtestjni.so => libs/arm64-v8a/libtestjni.so
[x86_64] Compile++ : testjni <= test.cpp
[x86_64] StaticLibrary : libstdc++.a
[x86_64] SharedLibrary : libtestjni.so
[x86_64] Install : libtestjni.so => libs/x86_64/libtestjni.so
[mips64] Compile++ : testjni <= test.cpp
[mips64] StaticLibrary : libstdc++.a
[mips64] SharedLibrary : libtestjni.so
[mips64] Install : libtestjni.so => libs/mips64/libtestjni.so
[armeabi-v7a] Compile++ thumb: testjni <= test.cpp
[armeabi-v7a] StaticLibrary : libstdc++.a
[armeabi-v7a] SharedLibrary : libtestjni.so
[armeabi-v7a] Install : libtestjni.so => libs/armeabi-v7a/libtestjni.so
[armeabi] Compile++ thumb: testjni <= test.cpp
[armeabi] StaticLibrary : libstdc++.a
[armeabi] SharedLibrary : libtestjni.so
[armeabi] Install : libtestjni.so => libs/armeabi/libtestjni.so
[x86] Compile++ : testjni <= test.cpp
[x86] StaticLibrary : libstdc++.a
[x86] SharedLibrary : libtestjni.so
[x86] Install : libtestjni.so => libs/x86/libtestjni.so
[mips] Compile++ : testjni <= test.cpp
[mips] StaticLibrary : libstdc++.a
[mips] SharedLibrary : libtestjni.so
[mips] Install : libtestjni.so => libs/mips/libtestjni.so
PS E:\02course\MyApplication\MyApplication09\JNI>
阶段二
-
在在src中 跟Activity同一层路径 创建一个 专门调用JNI的类 OBOJNI.class
//专门调用jni C++接口的类 public class OBOJNI { public static OBOJNI getInstance() { if (instance == null) { instance = new OBOJNI(); } return instance; } private static OBOJNI instance = null; //提供一个调用JNI接口的成员方法 public native void hello_jni(); //加载cpp给提供的 动态库 static { System.loadLibrary("testjni"); //libtestjni.so testjni要和Android.mk里面的模块名字是一样的 } }
-
使用 Windows PowerShell 进入java目录
然后执行
javah -jni com.你的包名.OBOJNI
运行示例:PS E:\02course\MyApplication\MyApplication09\JNI> cd E:\02course\MyApplication\MyApplication09\app\src\main\java
PS E:\02course\MyApplication\MyApplication09\app\src\main\java> ls目录: E:\02course\MyApplication\MyApplication09\app\src\main\java
Mode LastWriteTime Length Name
d----- 2021/10/15 17:32 com
PS E:\02course\MyApplication\MyApplication09\app\src\main\java> javah -jni com.ddh.dai.myapplication09.OBOJNI
错误: 编码GBK的不可映射字符
错误: 编码GBK的不可映射字符
错误: 编码GBK的不可映射字符
错误: 编码GBK的不可映射字符成功后会多一个文件
-
将标注部分加入test.cpp中
修改test.cpp为
// // Created by Daidenghui on 2021/10/15. // #include <jni.h> #include <android/log.h> void testJni_Hello() { __android_log_print(ANDROID_LOG_ERROR,"testjni", "JNI: I am OK"); return; } #ifdef __cplusplus extern "C" { #endif /* * Class: com_ddh_dai_myapplication09_OBOJNI * Method: hello_jni * Signature: ()V */ JNIEXPORT void JNICALL Java_com_ddh_dai_myapplication09_OBOJNI_hello_1jni (JNIEnv *ev, jobject){ testJni_Hello(); } #ifdef __cplusplus } #endif
-
再次使用Windows PowerShell进入JNI目录
执行:ndk-bulid.com
运行示例:
PS E:\02course\MyApplication\MyApplication09\JNI> cd E:\02course\MyApplication\MyApplication09\JNI
PS E:\02course\MyApplication\MyApplication09\JNI> ndk-build.cmd
[arm64-v8a] Compile++ : testjni <= test.cpp
[arm64-v8a] SharedLibrary : libtestjni.so
[arm64-v8a] Install : libtestjni.so => libs/arm64-v8a/libtestjni.so
[x86_64] Compile++ : testjni <= test.cpp
[x86_64] SharedLibrary : libtestjni.so
[x86_64] Install : libtestjni.so => libs/x86_64/libtestjni.so
[mips64] Compile++ : testjni <= test.cpp
[mips64] SharedLibrary : libtestjni.so
[mips64] Install : libtestjni.so => libs/mips64/libtestjni.so
[armeabi-v7a] Compile++ thumb: testjni <= test.cpp
[armeabi-v7a] SharedLibrary : libtestjni.so
[armeabi-v7a] Install : libtestjni.so => libs/armeabi-v7a/libtestjni.so
[armeabi] Compile++ thumb: testjni <= test.cpp
[armeabi] SharedLibrary : libtestjni.so
[armeabi] Install : libtestjni.so => libs/armeabi/libtestjni.so
[x86] Compile++ : testjni <= test.cpp
[x86] SharedLibrary : libtestjni.so
[x86] Install : libtestjni.so => libs/x86/libtestjni.so
[mips] Compile++ : testjni <= test.cpp
[mips] SharedLibrary : libtestjni.so
[mips] Install : libtestjni.so => libs/mips/libtestjni.so
然后运行即可
看到输出就表示成功
end
每次修改.cpp文件后都需要使用Windows PowerShell进入JNI目录执行:ndk-bulid.com