JNI开发的流程①

Posted nangongyibin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JNI开发的流程①相关的知识,希望对你有一定的参考价值。

 
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就是要加载的模块的名字


以上是关于JNI开发的流程①的主要内容,如果未能解决你的问题,请参考以下文章

JNI_2

jni开发初试

JNI/NDK开发指南—— JNI开发流程及HelloWorld

[RK3568][Android11]JNI调用流程分析

[RK3568][Android11]JNI调用流程分析

JNI开发流程-JNI/NDK