码迷,mamicode.com
首页 > 其他好文 > 详细

JNI开发的流程①

时间:2019-02-24 10:20:40      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:技术   col   nbsp   var   shared   文件系统   mac   linux   就是   

 
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开发的流程①

标签:技术   col   nbsp   var   shared   文件系统   mac   linux   就是   

原文地址:https://www.cnblogs.com/nangongyibin/p/10425279.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!