- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JNI 入门
下面通过一个简单的 JNI 案例来演示如何使用 JNI 编程。
创建一个新的 Android 工程《JNI 入门》,工程的最终目录结构如下图所示。
在 MainActivity.java 类中定义一个 native 方法
//定义一个 native 方法,意思是该方法的具体实现交给 C 语言实现
publicnativeString helloC();
在工程跟目录下创建一个文件夹 jni,该目录名称是约定(约定优于配置)好的,不能是其他名
字。
在 jni 目录下创建 hello.c 源文件,文件名可以按照见名知意的规则来创建。hello.c 代码清单如下。
#includestdio.h//引入头文件
4
//引入 jni.h jni.h 文件里面定义了 jni 的规范,jni.h 在 ndk 的目录中找到,然后放到当前工程中的 jni 目录下即可
#includejni.h
//定义在 MainActivity.java 类中的 helloC 对应的 C 语言函数
jstring Java_com_itheima_jnihello_MainActivity_helloC(JNIEnv* env, jobject obj) {
char* str =hellofromC;
//调用 jni.h 中定义的创建字符串函数
jstring string =(*(*env)).NewStringUTF(env,str);
returnstring;
:上面的代码虽然简单但是关于 jni.h 头文件和方法名必须单独说明。
1)jni.h 头文件位于 NDK 安装目录下/platforms/android-*/(某平台)/usr/include 目录中,如下图
上面的某平台指 CPU 的三种架构如下图。我们选择任意一架构皆可,但是对于手机来说 CPU 用 arm 架构的最多,x86 次之,mips 架构最少。
2)JNI 中 C 源文件方法名的命名规则
这里的命名规则指用于跟 java 文件中 native 方法对应的 C 语言方法,而 C 语言中的其他方法命名只
要符合 C 语言规则就行。jstring Java_com_itheima_jnihello_MainActivity_helloC(JNIEnv* env, jobject obj)
中,jstring 是方法返回值类型,我们可以把 jstring 看成是 java 中 String 跟 C 语言中 char*类型的一个中间转换类型,java 跟 C 语言的数据类型是不一样的,他们之间要想互相调用就必须通过一种中介来实现,这个中介就是在 jni.h 头文件中定义的。关于更多的转换类型,在本文档的第 2 章会有更详细的说明。
方法名第一个字母必须是 Java,首单词大写,然后下划线_,然后是将该方法所在的包、类、方法用
“_”连接起来,比如 com.itheima.jnihello.MainActivity 类中的 helloC 方法,转变成 C 语言中的方法名为Java_com_itheima_jnihello_MainActivity_helloC。
方法的形参有两个是必须的也就是不管 java 中的方法是否有形参,但是 C 语言中对应的方法必须有
5
JNIEnv* env,和 jobject obj,如果 java 方法中还用其他形参,那么在 C 语言中严格按照顺序排在 jobject obj
参数的后面即可。
上面的 env 代表指向 JVM 的指针,obj 是调用该方法的 java 对象。
使用 NDK 工具将 hello.c 编译成 hello.so 文件
为了方便直接在控制台中使用 NDK 工具的 ndk-build.cmd 命令,我们首先将 ndk-build.cmd 所在的目录
设置成系统环境变量。环境变量配置好以后,在命令行中输入 ndk-build.cmd 会有如下提示:
将当前目录切换到 hello.c 所在的工程目录
这时候如果直接输入 ndk-build.cmd 那么会出现如下异常:
出现这种错误时因为我们并没有告诉 ndk 我们要将那个 C 语言源代码编译成目标文件。为了告诉 ndk 要将那个 C 源文件编译成目标文件,我们需要在工程中的 jni 目录中添加 Android.mk 配置文件。
在当前工程的 jni 目录下添加 Android.mk 配置文件,该配置文件可以从 ndk 安装目录的实例代码中拷贝,然后修改。
Android.mk 文件清单如下,我们只需要修改 LOCAL_MODULE 和 LOCAL_SRC_FILES 两个参数即可。
LOCAL_MODULE 参数是指定编译后的目标文件的名
您可能关注的文档
最近下载
- 阿特拉斯.科普科-离心空压机说明书AIB 9829300826-01.pdf VIP
- 普通话课程教案.pdf VIP
- 无肝素透析技术无肝素透析技术及护理.ppt VIP
- 科技成果评价申请表模板1.doc VIP
- 2025高校教资《高等教育心理学》考前必练题库资料500题(含真题、重点题).pdf
- “技术差距论”ppt课件讲义.ppt VIP
- 2025年粤医云、国培卫健1月份(中医)考核答案-鼻鼽中医辨证与经方治疗1、2.doc VIP
- 第七章_管子的经济思想..ppt VIP
- CJJ1-2008城镇道路工程施工与质量验收规范1.pdf VIP
- 重庆市万州二中2024-2025学年高一上学期10月月考英语试题答案.docx VIP
文档评论(0)