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

J NI 详解 Java Native Interface,(JNI)是一个标准的 Java API,它支持将 Java 代码 与使用其他编程语言编写的代码相集成。在这里主要就是Java和C++的交互。 1:java调用C++: 首先在java文件中对将要调用的方法做本地声明,关键字为native。且只 需要声明,而不需要具体实现。如 public native void loginSuccessNative(String p_qqId); public native static void setStateNative(int i); 然后我们需要在c++文件中实现这些方法,这些方法有特定的格式,我们可 以使用javah命令来帮助生成这些方法的声明 调用javac编译我们的java类,获得class文件,然后javahyourClassName 便可以得到一个.h文件: #include #ifndef _Included_com_test_Hello #define _Included_com_test_Hello #ifdef __cplusplus extern C { #endif JNIEXPORTvoidJNICALLJava_com_test_Hello_loginSuccessNative (JNIEnv*, jclass, jstring); JNIEXPORT void JNICALL Java_com_test_setStateNative (JNIEnv *, jclass, jint); #ifdef __cplusplus } #endif #endif 其实只要知道了这个格式,我们也可以自己手动来写。由于java直接回查 找cpp里的方法,所以.h文件我们也可以不用声明。 JNIEXPORT void JNICALL Java_com_test_setStateNative(JNIEnv *, jclass, jint state) { gameState state; } 最后我们需要将c++文件,编译成so然后加入java工程,并在java 中导入。 static { System.loadLibrary(“test”); }//系统会自己判断后缀。 2:在C++中调用java方法。 C++中调用java会比较麻烦一些,因为需要在C++中获取java 的运行环境,并寻找我们要 用的类和方法。首先我们需要了解几个概念: JavaVM:这个代表java 的虚拟机。所有的工作都是从获取虚拟机的接口开始的,如何获取 这个接口呢?我们之前导入C 的组件时调用了: System.loadLibrary(“test”); 调用该方法时,java会先调用该组件的JNI_OnLoad()函数.其用途有二: 一是:告诉java VM此C组件使用那一个JNI版本。如果你没有提供JNI_OnLoad()函数, VM会默认使用最老的JNI 1.1版本。由于新版的JNI做了许多扩充,如果需要使用JNI的 新版功能,例如JNI1.4的java.nio.ByteBuffer,就必须藉由JNI_OnLoad()函数来告知VM。 二是:由于VM执行到System.loadLibrary()函数时,就会立即先呼叫JNI_OnLoad(),所以 C组件的开发者可以藉由JNI_OnLoad()来进行C组件内的初期值之设定,也就是获取JavaVM 接口。 如: jint JNI_OnLoad(JavaVM *vm, void *reserved) { JniHelper::setJavaVM(vm);//获取JavaVM接口 return JNI_VERSION_1_4;//告知java使用什么版本的VM } : 它 JNIEnv 代表Java环境。通过这个JNIEnv*指针,就可以对Java端的代 码进行操作。如,创建Java类得对象,调用Java对象的方法,获取Java对象 的属性等。通过之前获得的JavVM我们可以获取JNIEnv: static bool getEnv(JNIEnv **env) { bool bRet false; do {

文档评论(0)

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

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

1亿VIP精品文档

相关文档