Android安卓JNI/NDK开发

eclipse下使用JNI

1. 在项目根目录下创建jni文件夹 ,与src同级

2. 在jni文件中创建一个c文件后缀名为.c

/****这就是创建一个jni的native方法,用来调用c函数****/

3. 在java代码中,创建一个本地方法,名字随意,如helloFromc()方法,没有方法体,连大括号也不要。

但是必须加关键字native,表明该方法是本地方法,需要c语言来实现方法体。

public native String helloFromC();

/***这就是创建一个c函数,供native层来调用,所以名字很重要***/

4. 在jni文件夹中定义C语言写的函数实现这个方法,在c文件中添加头文件 ,这样才能识别jstring,env等那些东西

函数格式为

jni对应的返回值类型 Java_包名_方法名(两个必填参数){}

注意:数据类型不要搞错;

Java的j是大写;

包名里面的点最好都换成下划线

JNIEnv* env:是一个java虚拟即的地址指针,是个二级指针,因为env本来就是一个指针,再*一下就是二级指针

jobject obj:调用该c方法的对象,就这样照写

jstring Java_com_itheima_helloworld1_MainActivity_helloFromC(JNIEnv* env, jobject obj)//虽然本地native方法中helloFromc是无参方法,但是C语言中的必须加上这两个参数

5. 返回一个字符串,用c定义一个字符串

char* cstr = "hello from c";

6. 把c的字符串转换成java的字符串

jstring jstr = (*env)->NewStringUTF(env, cstr);

return jstr;

前面都是定义部分,定义好C语言后要编译,编译就需要用到ndk工具来进行编译,就要讲法ndk配置进环境变量 ,

配制方法就是把 路径:android-ndk-r9b 加进path

7. 在jni中创建Android.mk文件 ,文件里面的内容:

LOCAL_PATH :=$(call my-dir)

include $(CLEAR_VERS)

编译生成的类库起个名字

LOCAL_MODULE:=heihei//这里同样可以叫Hello

要编译的C语言文件

LOCAL_SRC_FILES:=Hello.c

include $(BUILD_SHARED_LIBRARY)

8. 在jni文件夹下打开cmd后执行ndk-build.cmd指令

9. java代码中加载so类库,调用本地方法。写在静态代码块中Static{loadLibrary(“库名”);}

-------------------mk文件详解start--------------

# $是调用编译工具链中的函数, 这里的作用是获取当前文件目录.

LOCAL_PATH := $(call my-dir)

# 清空并初始化编译工具链的变量.

# 注意: 会清空所有的LOCAL_变量, 但不会清空LOCAL_PATH的变量.

include $(CLEAR_VARS)

# 编译出来文件的名字, 编译系统会在名字前加lib前缀. 如果已经写lib, 不会再添加.

# 注意: 不可以加扩展名.

LOCAL_MODULE := atguigu

# 指定编译的源文件.如果多个源文件可以用空格连接起来

LOCAL_SRC_FILES := hello.c

# 指定编译文件类型

# 动态库(BUILD_SHARED_LIBRARY) 扩展名:.so 体积小.

# 静态库(BUILD_STATIC_LIBRARY) 扩展名:.a 体积大.

include $(BUILD_SHARED_LIBRARY)

----------------mk文件详解end------------------

AS下使用JNI(as版本1.5完美,其他版本有问题

1、在main下创建一个jni文件夹,与java同级

2、3、4、5、6和eclipse一样。

然后在project的gradle.properties中添加配置 android.useDeprecatedNdk=true ,为了兼容老版本

7、在app的build.gradle文件中的defaultConfig{}里面添加

ndk{

moduleName "Hello" //so文件: lib+moduleName+.so ,Hello就是后来要用的so库名

abiFilters "armeabi", "armeabi-v7a", "x86" //cpu的类型

}

然后build项目,使项目生成so文件,生成的so文件在app�uildintermediates dkdebuglib下。

生成的链接库名叫“libHello.so”,当然我们也可以不写这段代码,也能编译生成so库,生成的名字是“libapp.so”,建议还是写上,不然多了就不行了

在这里我们会发现步骤7不同,as的少了创建mk文件这个步骤,其实as已经帮我们创建了,因为我们的在gradle文件中进行了配置

8、回到本地方法native那里,在写native方法之前加载so库,System.loadLibrary("Hello");通常这行代码写在代码块或静态代码块中。这样一样我们的native方法就会到Hello库中去找与之对应的c函数,其实我们更应该在创建native方法的时候就这样写,后面要build之前确定moudleName是否与我们加载的这个库名

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容