JNI开发的流程①
Posted nangongyibin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JNI开发的流程①相关的知识,希望对你有一定的参考价值。
windows 平台下写 C的代码 运行在linux
native 语言 平台相关性强
NDK native develop kit
交叉编译 在一个平台上模拟另外一个平台的特点来编译native 代码
平台
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就是要加载的模块的名字
以上是关于JNI开发的流程①的主要内容,如果未能解决你的问题,请参考以下文章