windows 平台下写 C的代码 运行在linux
native 语言 平台相关性强
NDK native develop kit
交叉编译 在一个平台上模拟另外一个平台的特点来编译native 代码
平台
操作系统平台 windows mac os linux 类unix iOS android
CPU 平台 x86 pc(intel amd) arm mips
通用流程
① java代码中声明一个native方法 native方法不用实现
public native String hello();
②在模块的根目录下创建一个jni目录 创建.c的源代码
JNIEXPORT jstring JNICALL Java_ngyb_jnihello_MainActivity_hello(JNIEnv *env,jobject thiz){ char* str = "hello c!!!!!!!"; return (*env)->NewStringUTF(env,str); }
③在jni的目录下创建一个Android.mk文件 .mk 是linux makefile 编译文件 向编译系统描述
要编译的源代码在什么目录下 叫什么名字 编译之后生成什么类型的文件 文件名是什么
LOCAL_PATH := $(call my-dir) #获取当前的路径 include $(CLEAR_VARS) LOCAL_MODULE := hello-jni #LOCAL_MODULE 生成的模块的名字 LOCAL_SRC_FILES := hello.c #LOCAL_SRC_FILES 指定要编译的代码的名字 include $(BUILD_SHARED_LIBRARY) #指定生成一个动态链接库 linux下就是.so windows下就是 .dll
④调用ndk-build来编译文件
在项目的根目录下来编译 如果找不到模块的话 通过NDK_PROJECT_PATH=app 来指定模块的名字
⑤编译成功之后会生成.so 会放在模块的libs目录下 可以通过 模块的gradle配置 指定.so的位置
在模块的gradle中 android{}内写如下内容
sourceSets.main.jniLibs.srcDirs = ['libs']
⑥项目运行之前通过 System.loadlibrary加载.so模块
需要注意 生成的.so文件系统会自动加上一个lib前缀
System.loadLibrary的时候 不要写lib前缀 去掉lib 去掉.so就是要加载的模块的名字