注:本教程基于最新的Android sudio3.3,自己仅作记录,一些具体解释可以到
1、环境搭建
- 下载ndk https://developer.android.google.cn/ndk/downloads/
- 解压后将根目录配置到系统的PATH路径下面
2、demo开发
- build.gradle中配置ndk相关信息
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.android.jniapp"
minSdkVersion 14
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
//指定生成模块名字,也就是最终的动态库名RsaEncryptUtils_jni,相应库文件名
//RsaEncryptUtils_jni.so
moduleName "RsaEncryptUtils_jni"
//标准库
stl "stlport_staic"
//不加的话 .h文件打log 会报undefined reference to '__android_log_print'
//so库中输出log必须加
ldLibs "log"
// 指定生成哪些处理器架构的动态库文件,如果要运行在x86架构处理器一定需要指定
abiFilters "armeabi-v7a", "x86"
}
}
- c++文件
# include <jni.h> # include <stdio.h> # include <android/log.h> //方法名必须为本地方法的全类名点改为下划线,穿入的两个参数必须这样写, //第一个参数为Java虚拟机的内存地址的二级指针,用于本地方法与java虚拟机在内存中交互 //第二个参数为一个java对象,即是哪个对象调用了这个 c方法 //如果本地代码是C++(.cpp或者.cc),要使用extern "C" { }把本地方法括进去 //JNIEXPORT jstring JNICALL中的JNIEXPORT 和 JNICALL不能省 //关于方法名Java_scut_carson_1ho_ndk_1demo_MainActivity_getFromJNI //格式 = Java _包名 _ 类名_Java需要调用的方法名 //Java必须大写 //对于包名,包名里的.要改成_,_要改成_1 extern "C" { JNIEXPORT jstring JNICALL Java_com_android_jniapp_MainActivity_getEncryptData(JNIEnv *env, jobject obj ){ //so库log输出 __android_log_print(ANDROID_LOG_ERROR, "zj", "%s", "I love U!"); return env -> NewStringUTF("Hello i am from JNI!"); // 上述代码是返回一个String类型的"Hello i am from JNI!"字符串 } }
- Android.mk文件
-
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := RsaEncryptUtils_jni LOCAL_SRC_FILES := RsaEncryptUtils.cpp LOCAL_LDLIBS := -llog include $(BUILD_SHARED_LIBRARY)
- Application.mk
APP_ABI := armeabi-v7a x86 APP_PLATFORM := android-16
Add
关于.h文件的生成配置(转载两张图)
关于.cpp文件的生成配置(我这边不行。。。)
可使用AndroidStudio来直接生成cpp函数实现,方法如下,直接在native方法上按alt+enter生成:
参考文章
android NDK下log的使用和封装 https://blog.csdn.net/u012005313/article/details/52059053
Android:JNI 与 NDK到底是什么?(含实例教学) https://blog.csdn.net/carson_ho/article/details/73250163
Android NDK-0.Android Studio NDK快速生成.h头文件和native函数声明 https://blog.csdn.net/hgy413/article/details/82842768