jni对象的传递
来源:互联网 发布:mac air如何切换输入法 编辑:程序博客网 时间:2024/06/06 01:03
1.java与C之间的基本数据传递。
在这之前有必要先了解java与C之间基本类型映射关系,如下表所示:
举个从C返回字符串给Java的例子,C代码如下(这里是C++实现):
- JNIEXPORT jstring JNICALL Java_perfecter_jni_LoadJni_printFromC(JNIEnv* env,
- jobject obj) {
- jstring str = env->NewStringUTF("Hello from JNI !");
- return str;
- }
JNIEXPORT jstring JNICALL Java_perfecter_jni_LoadJni_printFromC(JNIEnv* env,jobject obj) {jstring str = env->NewStringUTF("Hello from JNI !");return str;}对应的java本地方法声明如下:
- public static native String printFromC();
public static native String printFromC();
这里就拿java的String与C的jstring举例了,上面 JNIEXPORT 和 JNICALL 是关键字。
2.java向C传递对象,C调用java对象的方法。
直接用代码说明,
- JNIEXPORT jstring JNICALL Java_perfecter_jni_LoadJni_getStringFromJavaObj(
- JNIEnv* env, jobject obj, jobject clsObj){
- jmethodID methodId;
- jclass objclass=env->GetObjectClass(clsObj);
- methodId=env->GetMethodID(objclass,"getString","()Ljava/lang/String;");
- jstring jstr=(jstring)env->CallObjectMethod(clsObj,methodId,NULL);
- return jstr;
- }
JNIEXPORT jstring JNICALL Java_perfecter_jni_LoadJni_getStringFromJavaObj(JNIEnv* env, jobject obj, jobject clsObj){jmethodID methodId;jclass objclass=env->GetObjectClass(clsObj);methodId=env->GetMethodID(objclass,"getString","()Ljava/lang/String;");jstring jstr=(jstring)env->CallObjectMethod(clsObj,methodId,NULL);return jstr;}java native方法
- public static native String getStringFromJavaObj(MyObj obj);
public static native String getStringFromJavaObj(MyObj obj);
MyObj类:
- package perfecter.jni;
- public class MyObj
- {
- private String name;
- public MyObj(){}
- public String getString(){
- return "String from MyObj"+name;
- }
- }
package perfecter.jni;public class MyObj{ private String name; public MyObj(){} public String getString(){ return "String from MyObj"+name; }}
应该很快可以看出来,C中代码就是java中的反射机制。这里说明下,像GetObjectClass这些函数可以到sun的jni官方文档去查询。
说明下GetMethodID(objclass,"getString","()Ljava/lang/String;"),参数依次为方法对象的jclass对象,方法名称,方法签名。
方法签名由方法参数和方法返回值构成,这里又分为基本数据类型和引用类型,
基本数据类型对应关系表如下:
引用类型规则如下:
以“L”开头,以“;”结束,中间对应的是该类型的路径
如:String : Ljava/lang/String;
Object: Ljava/lang/Object;
自定义类 MyObj 对应 package perfecter.jni.MyObj;
MyObj : Lperfecter/jni/MyObj;
"."换成“/”。
数组表示: 数组表示的时候以“[” 为标志,一个“[”表示一个维度
如:int [ ] :[I
Long[ ][ ] : [[J
Object[ ][ ][ ] : [[[Ljava/lang/Object;
其实不知道怎么生成签名的可以直接用命令行去查看,具体做法是在生成的类的class目录下执行 javap –s MyObj.3.C向java传递对象
直接看代码,
- JNIEXPORT jobject JNICALL Java_perfecter_jni_LoadJni_getJavaObj(JNIEnv* env,
- jobject obj){
- jclass clazz=env->FindClass("perfecter/jni/MyObj");
- if(clazz==0)
- return 0;
- jobject jobj=env->AllocObject(clazz);
- jfieldID fieldId=env->GetFieldID(clazz,"name","Ljava/lang/String;");
- env->SetObjectField(jobj,fieldId,env->NewStringUTF("wahaha"));
- return jobj;
- }
JNIEXPORT jobject JNICALL Java_perfecter_jni_LoadJni_getJavaObj(JNIEnv* env,jobject obj){jclass clazz=env->FindClass("perfecter/jni/MyObj");if(clazz==0)return 0;jobject jobj=env->AllocObject(clazz);jfieldID fieldId=env->GetFieldID(clazz,"name","Ljava/lang/String;");env->SetObjectField(jobj,fieldId,env->NewStringUTF("wahaha"));return jobj;}java对应的native方法申明public static native MyObj getJavaObj();
这个就是在C中构建对象,设置好属性后传过去。
- jni对象的传递
- JNI传递对象的处理方法
- JNI传递对象的处理方法
- JNI编程进阶 数据结构对象的传递
- JNI传递对象的处理方法
- JNI 对象数组传递
- Android JNI 传递对象
- Android JNI 传递对象
- JNI java和c之间对象的传递
- 操作JNI函数以及复杂的对象传递
- jni传递对象中包含arraylist对象。
- JNI学习1--传递java对象 demo
- JNI 函数以及复杂对象传递
- 操作JNI函数以及复杂对象传递
- JNI无法传递Android类对象
- JNI技术——JNI传递对象和JNI传递中文字符串
- JNI-String参数的传递
- AndroidStudio下JNI开发(easy+1.0)之Java对象的传递与修改
- Delphi 热键处理hotkey
- YII访问数据库(Yii Dao)
- munge 安装
- ubuntu启动停在Checking battery state
- ubuntu12.04安装中文输入法(ibus)和开机自动启动ibus应用
- jni对象的传递
- 用C++ 设计一个不能被继承的类
- zeroMQ
- Ubuntu下配置samba服务
- HtmlAgilityPack.dll爬虫获取百度音乐批量下载地址(C#源码)
- winform修改配置文件并保存,读取!
- [C#基础]XML读写
- backbone.js入门
- 20世纪最重要的12本物理学科类专论,你读了几本?