使用jni直接访问java对象中的字段
2014-05-22 13:08
417 查看
Java类:UserInfo
其中三个设置方法,期望使用C实现,这里涉及到JNI中的几个函数:
1、FindClass:找到某个类,并返回jclass对象
2、GetObjectClass: 获取到某个对象的类型,并返回jclass对象
3、GetFieldID:获取到字段的ID
4、SetIntField/SetLongField/SetObjectField:为字段设值
基于上面的几个方法,可以编写代码如下:
注意:由于方法签名、字段名称都是写死在C语言中的,因此代码不能混淆。
public class UserInfo { static { System.loadLibrary("userinfo"); } // 从JNI中直接访问字段 public String mUserName; public int mUserAge; public long mMoney; public UserInfo() { } public int getUserAge() { return mUserAge; } public native void setUserName(String name); public native void setUserAge(int age); public native void setUserMoney(long money); }
其中三个设置方法,期望使用C实现,这里涉及到JNI中的几个函数:
1、FindClass:找到某个类,并返回jclass对象
2、GetObjectClass: 获取到某个对象的类型,并返回jclass对象
3、GetFieldID:获取到字段的ID
4、SetIntField/SetLongField/SetObjectField:为字段设值
基于上面的几个方法,可以编写代码如下:
/* * Class: com_iflytek_testjni_UserInfo * Method: setUserName * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_com_iflytek_testjni_UserInfo_setUserName(JNIEnv *env, jobject obj, jstring jstr) { jfieldID fid; jclass cls = (*env)->GetObjectClass(env, obj); fid = (*env)->GetFieldID(env, cls, "mUserName", "Ljava/lang/String;"); (*env)->SetObjectField(env, obj, fid, jstr); } /* * Class: com_iflytek_testjni_UserInfo * Method: setUserAge * Signature: (I)V */ JNIEXPORT void JNICALL Java_com_iflytek_testjni_UserInfo_setUserAge(JNIEnv *env, jobject obj, jint age) { jclass objClass = (*env)->FindClass(env, "com/iflytek/testjni/UserInfo"); jfieldID ageID = (*env)->GetFieldID(env, objClass, "mUserAge", "I"); (*env)->SetIntField(env, obj, ageID, (int)age); } /* * Class: com_iflytek_testjni_UserInfo * Method: setUserMoney * Signature: (J)V */ JNIEXPORT void JNICALL Java_com_iflytek_testjni_UserInfo_setUserMoney(JNIEnv *env, jobject obj, jlong money) { jclass objClass = (*env)->FindClass(env, "com/iflytek/testjni/UserInfo"); jfieldID id = (*env)->GetFieldID(env, objClass, "mMoney", "J"); (*env)->SetLongField(env, obj, id, (long)money); }编写Android.mk后编译,可以测试通过。
注意:由于方法签名、字段名称都是写死在C语言中的,因此代码不能混淆。
相关文章推荐
- java 程序加载过程---3--类中申明同时申明类的静态对象 创建类的实例 访问类的静态变量 调用类的静态方法 使用反射方法 初始化类的子类对象 直接使用java.exe 调用某个类
- [JNI] Eclipse直接完成JAVA调用C/C++ (Eclipse上使用CDT结合MinGW)
- 在Java中,直接将类的对象使用system.out.println输出
- JNI中反向访问Java对象
- 当JNI遇到多线程--java对象如何被C++中的多个线程访问?
- 使用JXPath访问java对象、集合和XML文件
- 技术转载:Jni学习三:jni使用java对象详解
- JNI官方规范中文版——如何访问Java中的字段和方法
- JNI学习之---用jni API 访问java对象的属性,方法,调用构造器。
- Java中JNI的使用详解第四篇:C/C++中创建Java对象和String字符串对象及对字符串的操作方法
- [JNI] Eclipse直接完成JAVA调用C/C++ (Eclipse上使用CDT结合MinGW)
- JNI学习笔记:(1)开篇(2)本地代码访问Java代码 (3)本地方法取得Java属性/调用java方法 (4)本地代码创建Java对象(包括javaString) (5) 本地方法处理java数组
- JNI学习笔记(四)JNI中本地语言创建Java对象并且访问具体方法(附例子)
- javascript 直接创建对象与间接创建对象 私有函数不能访问this变量 是否使用var声明变量几个问题探讨
- Jni学习三:jni使用java对象详解
- 关于Java.net.URL对象使用Proxy访问Internet资源
- 当JNI遇到多线程--java对象如何被C++中的多个线程访问?
- 当JNI遇到多线程--java对象如何被C++中的多个线程访问?
- Code Fragment-简单的数据类直接使用public字段来访问设值。
- 当JNI遇到多线程--java对象如何被C++中的多个线程访问?