jni规范: https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html
NDK文档:
https://developer.android.google.cn/ndk/guides/
NDK参考:
https://developer.android.google.cn/ndk/reference/
NDK示例:
https://developer.android.google.cn/ndk/samples/
Application.mk:
此文件枚举并描述您的应用需要的模块。 这些信息包括:
用于针对特定平台进行编译的 ABI。
工具链。
要包含的标准库(静态和动态 STLport 或默认系统)。
Android.mk:必须在 jni 文件夹内创建 Android.mk 配置文件。 ndk-build 脚本将查看此文件,其中定义了模块及其名称、要编译的源文件、版本标志以及要链接的库。
NDK构建系统以jni目录作为NDK项目目录,jni目录要有Android.mk文件。
LOCAL_LDLIBS += -llog 链接系统的动态库
LOCAL_STATIC_LIBRARIES +=
LOCAL_SHARED_LIBRARIES += 链接本地库
APP_CFLAGS
APP_CPPFLAGS 模块公用的
ndk-build NDK_LOG=1 V=1 显示构建过程详细日志
NDK构建时使用的系统头文件位置:
$(NDK_DIR)/sysroot/usr/include
NDK构建时链接的系统动态库静态库位置:
$(NDK_DIR)/platforms/android-?/arch-arm/usr/lib/
JNIEnv JNI函数表接口指针,C和C++使用稍有不同
C (*env)->XXXX()
C++ env->XXX()
通过(*env)->GetStringXXXX获取的C字符串用完后要自己释放。
(*env)->ReleaseStringUTFChars
JAVA类型签名映射,特殊的几个:
Boolean Z
Long J
类 Ljava/lang/String;
type[] [type
方法 ()V
创建/销毁全局引用
(*env)->NewGlobalRef(env, obj)
(*env)->DeleteGlobalRef(env, obj)
日志
#include <android/log.h>
__android_log_write(ANDROID_LOG_DEBUG, "MyTag", "***************** ");
ndk-gdb 调试原生代码
ndk-stack 分析堆栈信息
启用JNI调用检查:
adb shell setprop debug.checkjni 1