Jni访问java的属性,方法
来源:互联网 发布:mac看视频发热严重 编辑:程序博客网 时间:2024/05/16 00:56
基本属于翻译。
首先必须存在之前传入的jobject obj,在根据 JNIEnv来获取jclass。
jclass cls = (*env)->GetObjectClass(env, obj);
当获取的jclass之后,也就知道该class的排布,之后开始获取相关的field。
jfieldID fid = (*env)->GetFieldID(env, cls, "s", "Ljava/lang/String;");之后就是对于field的解析工作,这里这个是string,由于需要返回的是具体instance中的树枝,所以这里需要obj。jstring jstr = (*env)->GetObjectField(env, obj, fid);
如果是int等primitive参数,使用GetIntField系列的就好。
jni区域标识符
这个标识符用来描述区域的表示,已L开始,[代表数组, [I是int类型的数组,并且已分号结尾。
如果是类的应用,例如java.lang.String
书写为"Ljava/lang/String;"
具体的表格如下
Z
boolean
B
byte
C
char
S
short
I
int
J
long
F
float
D
double
"Ljava/lang/String;"
String
"[I"
int[]
"[Ljava/lang/Object;"
Object[]
可以利用工具javap来检查
javap -s -p YouClass
s Ljava/lang/String;
这里的函数的描述符。顺序是(param)returntype,其中参数和参数之间无需加任何符号。
Method Descriptor Java Language Type "()Ljava/lang/String;"
String f();
"(ILjava/lang/Class;)J"
long f(int i, Class c);
"([B)V"
String(byte[] bytes);
javap效果,如下
javap -s -p InstanceMethodCallprivate callback ()Vpublic static main ([Ljava/lang/String;)Vprivate native nativeMethod ()V
实例代码,如果在C中启动Runnable的run函数
jobject thd = ...; /* a java.lang.Thread instance */jmethodID mid;jclass runnableIntf = (*env)->FindClass(env, "java/lang/Runnable"); /*或者这里可以使用GetObjectClass来获取jclass*/if (runnableIntf == NULL) { ... /* error handling */}mid = (*env)->GetMethodID(env, runnableIntf, "run", "()V");if (mid == NULL) { ... /* error handling */}(*env)->CallVoidMethod(env, thd, mid);... /* check for possible exceptions */
C中回调java的函数
Call<type>Method----其中type代表该函数的返回值
每次都这作样的查找必然会损伤效率,这里缓存查找的结果
有2中方式,一种是在首次使用的时候,一种是在初始化的时候
1.首次使用很简单。
if(NULL = field_id) field_id = (*env)->GetXXXX
2.在构造中初始化其实是对于1方案的改进,因为1方案无法解决多线程重入判断的语句,而且还多了一条if语句,不符合追求最高性能的方法
classInstanceMethodCall
{ private static native void initIDs(); private native void nativeMethod(); private void callback() { System.out.println("In Java"); } public static void main(String args[]) {InstanceMethodCall
c = newInstanceMethodCall
(); c.nativeMethod(); } static { System.loadLibrary("InstanceMethodCall
"); initIDs(); }}其中 ,利用构造函数最先被调用的特点来初始化JNIEXPORT void JNICALL Java_InstanceMethodCall
_initIDs(JNIEnv *env, jclass cls){ MID_InstanceMethodCall
_callback = (*env)->GetMethodID(env, cls, "callback", "()V");}
JNIEXPORT void JNICALL Java_InstanceMethodCall_nativeMethod(JNIEnv *env, jobject obj) { printf("In C/n"); (*env)->CallVoidMethod(env, obj, MID_InstanceMethodCall
_callback); }
- Jni访问java的属性,方法
- jni访问java的属性和方法
- JNI笔记 C访问java属性方法
- JNI学习(三)、JNI本地方法访问Java端的属性和方法
- JNI学习之---用jni API 访问java对象的属性,方法,调用构造器。
- jni访问java方法
- 用jni API 访问java对象的属性,方法,调用构造器
- JNI学习总结——C/C++访问Java类的属性与方法
- JNI官方文档翻译4-属性和方法的访问
- JNI 之数据类型与属性和方法的访问
- HAL/JNI简明笔记(五)——JNI访问java中的属性和方法
- JNI开发之访问java属性方法和静态属性方法
- JNI访问Java数组方法
- [JNI]开发之旅(6)JNI函数中访问java类中对象的属性
- jni应用(如何访问方法Java的类)
- JNI学习笔记(三)JNI中本地语言访问Java类中的属性与方法(附例子)
- JNI语法之数据类型和C访问Java属性和方法
- JNI(C访问Java方法)
- 配置网络
- Android 2.2 source code construction
- 二层交换机
- 基于RoR项目管理系统 Redmine WinXp 下安装总结
- sed命令详解
- Jni访问java的属性,方法
- Memcached 学习笔记
- API Hook完全手册
- Linux wget 命令
- 软件公司异地实施项目的项目经理:最锻炼人的职业
- 第一篇CSDN博客
- PHP中系统默认全局变量汇总
- 三层交换
- 小蜗牛慢慢爬吧