Android JNI 调用DLL.pdf

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Android JNI 调用DLL

1.JNI (1)Java call Native C JNI的基本概念可以参考以下文献: /believefym/archive/2007/06/08/1644635.aspx 这里需要注意的是javah命令处理的是.class文件,而不是.java文件。你需要指定package的路径和 package名。javap命令也有类似的要求。 例子很简单,可以从下面的网页获得,C++的代码没有配工程,将之编译成DLL即可。 /d/21e857fd04fc086ce0b3ba90ba92f197e1b626ca55df0000 (2)Native C call Java 基本方法参考下列文献: /post/3982/19158 注意事项: 使用构造函数时,JDK1.1的写法是: jmethodID mid = (*env)-GetMethodID(env,cls,,(Ljava/lang/String;)V); 而JDK1.2的写法是: jmethodID mid = (*env)-GetMethodID(env,cls,init,(Ljava/lang/String;)V); 例子的功能,和上面的例子类似,可以从下面的网页获得 /d/688b2aca53531d0aeb236015f95fd36b594005392d520000 (3)Java call Native C Native C callback Java Android由于提供的是Java接口,所以这里最常见的情况是 1)Java启动程序。 2)Java调用Native C。 3)Native C回调Java。 有上面的编程经验,这个也不是太难的事,例子如下: /d/54782eb9fc9480904e4152adff6e1df28f648976f83f0000 这个例子和(2)中的区别在于:(2)中的例子由于程序是用C启动的,所以在调用Java之前,需要启动 JVM,并实例化相关的Java对象,而(3)中例子由于程序是用Java启动的,在C回调Java时,JVM已经启动, 相关的Java对象实例也已存在,所以做法要简单的多。 使用javah生成的.h文件中,函数的声明在Java中声明的参数之前,还有两个参数JNIEnv和jobject。env 是调用Java方法的接口,它的功能非常多。jobject传入的是调用Native C的那个Java对象实例的引用。 jobject指针不能在多个线程中共享. 就是说,不能直接在保存一个线程中的jobject指针到全局变量中,然后在 另外一个线程中使用它.幸运的是,可以用 gs_object=env-NewGlobalRef(obj); 来将传入的obj保存到gs_object中,从而其他线程可以使用这个gs_object来操纵那个java对象了。 2.在Android上编译C程序 (1)风临左岸在这方面颇有建树,以下是他的blog: /flza 最简单的hello world程序可以参看下面这篇文章的做法。 Android原生(Native)C开发之一:环境搭建篇 /s/blog_4a0a39c30100auh9.html 这里有个概念要弄清楚,之前的例子都是针对x86-win32平台的,而这里我们要在arm-linux下编程。我这 里有个同事,曾将x86-win32下的dll放到Android模拟器中,然后抱怨无法使用JNI,这就是这类错误的一个 典型的例子。 还有一点需要注意的是,风临左岸使用的交叉编译工具,所编出的程序虽然可以在模拟器中运行,但却 是无法直接用于JNI的,需要使用一定的技巧,可参见以下网页: Shared library Hello World! for Android /2007/12/shared-library-hello-world-for-android.html 从这篇文章可以看出,风临左岸使用的交叉编译工具的动态库的默认格式,和Android平台的动态库的格 式是不同的,这也是之前有人说Android无法使用JNI的原因。 更好的办法是直接使用google提供的交叉编译工具。 (2)获得Android的源代码 获得源代码的官方方法如下: /source/download.html 虽然源代码在下,但用浏览器是无法获得代码的,只能用上文提到的方法才 行。 当然诸如之类的网站也提供了非官方的源代码下载。 源代码的大小有1G左右,解压源代码,在源代码的prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin文件 夹下可以找到google提供的交叉编译工具。

文档评论(0)

l215322 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档