- 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详解
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)