JNI详解
更新时间:2024-03-04 18:28:01 阅读量: 综合文库 文档下载
- JNI详解推荐度:
- 相关推荐
JNI详解
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(inti);
然后我们需要在c++文件中实现这些方法,这些方法有特定的格式,我们可以使用javah命令来帮助生成这些方法的声明 调用javac编译我们的java类,获得class文件,然后javahyourClassName 便可以得到一个.h文件:
#include
#ifndef _Included_com_test_Hello #define _Included_com_test_Hello #ifdef __cplusplus extern \ #endif
JNIEXPORT void JNICALL Java_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的新版功能,例如JNI 1.4的java.nio.ByteBuffer,就必须藉由JNI_OnLoad()函数来告知VM。 二是:由于VM执行到System.loadLibrary()函数时,就会立即先呼叫JNI_OnLoad(),所以C组件的开发者可以藉由JNI_OnLoad()来进行C组件内的初期值之设定,也就是获取JavaVM接口。 如:
jintJNI_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:
staticboolgetEnv(JNIEnv **env) { boolbRet = false; do { if (JAVAVM->GetEnv((void**)env, JNI_VERSION_1_4) != JNI_OK) { LOGD(\ break; } if (JAVAVM->AttachCurrentThread(env, 0) < 0) { LOGD(\ break; } bRet = true; } while (0); returnbRet; }
有了上面的准备,下面我们就可以开始调用java的东西了:
一:获取对象的类id
我们只要知道类的名字就可以通过JNIEnv来获取classid
jclassclassID = pEnv->FindClass(className);
二:获取要调用的方法id,包括静态和普通方法。
jmethodIDmethodID = pEnv->GetStaticMethodID(classID, methodName, paramCode);
jmethodIDmethodID = pEnv->GetMethodID(classID,methodName, paramCode);
这其中的最后一个参数代表方法的参数信息,因为java支持多态,只有完整的参数信息才可以找到唯一的方法。这个参数有着特定的格式,见附录。
三:调用方法,同样包括静态和普通。
pEnv->CallStatic***Method(classID,methodID); pEnv->Call***Method(classID,methodID); 不同的返回参数,调用不同的方法,如CallBooleanMethod,CallIntMethod,CallObjectMethod,CallStaticIntMethod等等。
附:函数属性签名规则:
在GetMethodID最后一个参数是签名字符串,用来标示java函数和成员的唯一性。因为java中存在重载函数,所以一个函数名不足以唯一指定一个函数,这时候就需要签名字符串来指定函数的参数列表和返回值类型了。
函数签名是一个字符串:\,括号中的内容是函数的参数类型,括号后面表示函数的返回值。
具体的每一个字符的对应关系如下 字符 Java类型 C类型 V void void Z jboolean boolean I jint int J jlong long D jdouble double F jfloat float B jbyte byte C jchar char S jshort short
数组则以”[\开始,用两个字符表示 [I jintArray int[] [F jfloatArray float[] [B jbyteArray byte[] [C jcharArray char[] [S jshortArray short[] [D jdoubleArray double[] [J jlongArray long[] [Z jbooleanArrayboolean[]
如果Java函数的参数是class,则以”L”开头,以”;”结尾,中间是用”/” 隔开的包及类名。而其对应的C函数名的参数则为jobject 一个例外是String类,其对应的类为jstring Ljava/lang/String; String jstring Ljava/net/Socket; Socket jobject
正在阅读:
JNI详解03-04
中央电大开放本科会计学专业财务案例研究试题_090708-30
会做的不如会说的,-,杂文,-,红袖添香02-12
普通话水平测试必读60篇短文01-20
小巴掌童话好词好句10-29
城市管理行政执法工作中存在的问题及对策09-18
解决问题的策略转化教学设计01-06
2012北师大版五年级语文下试卷03-15
十不准 施工现场隧道施工人员安全手册10-10
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 详解
- JNI
- 直角三角形斜边上的中线(详细解析+考点分析+名师点评)-1.doc
- 杭州花圃植物景观调研报告 - 图文
- 江苏省高校申报高级职务同行专家鉴定表
- 最新2018自我介绍信怎么写-word范文(6页)
- 电工学复习指导
- 《内部审计实务指南第2号-物资采购审计》
- 2017年七年级教科版道德与法治期末复习提纲解析
- 说说2017最新英语说说
- 项目部绩效考核办法 - 图文
- 世界园林的三大体系 - 图文
- 软件工程概论论文:网上考试系统概要设计说明书
- 校企合作就业培训协议
- “幸福女人,美丽人生”专题文化讲座致辞
- 2016年中央财经大学金融硕士考研真题精编
- 高速公路路面泡沫沥青冷再生施工作业指导书
- 常用准入认证技术原理分析精编版 - 图文
- 2016年下半年天津房地产工程测量员考试试题
- 人文-2014医师定期考核题库42
- 五年级语文下册第2课《捅马蜂窝》(启发引导)教学设计冀教版
- 老年之家项目方案