黑马程序员安卓教程:JNI 入门要领.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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 参数是指定编译后的目标文件的名

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档