设为首页 加入收藏

TOP

Java中JNI的使用(上)(二)
2018-10-08 10:03:54 】 浏览:409
Tags:Java JNI 使用

的全称,但是需要把包名中的点.替换成斜杠/。(好吧,事实上我不是太明白为啥要这么做。)

有了 jfieldID 和 jmethodID 就知道狗蛋住哪了,现在去狗蛋家找他玩 ?(^?^*)

1. get:

  • <type> Get<type>Field(jobject , jfieldID); 即可获得对应的field,其中field的类型是type,可以是上面类型所叙述的任何一种
  • <type> GetStatic<type>Field(jobject , jfieldID); 同1,唯一的区别是用来获取静态成员。
2. set:
  • void Set<type>Field(jobject obj, jfieldID fieldID, <type> val)
  • void SetStatic<type>Field(jclass clazz, jfieldID fieldID, <type> value);

成员方法:

调用方法自然要把方法的参数传递进去,JNI中实现了三种参数的传递方式:

  1. Call<type>Method(jobject obj, jmethod jmethodID, ...) 其中 ... 是 C 中的可变长参数,类似于 printf 那样,可以传递不定长个参数。于是你可以把 Java 方法需要的参数在这里面传递进去。
  2. Call<type>MethodV(jobject obj, jmethodID methodID, va_list args) 其中的 va_list 也是 C 中可变长参数相关的内容(我不了解,不敢瞎说,偷懒粘一下Oracle的文档)“Programmers place all arguments to the method in an args argument of type va_list that immediately follows the methodID argument. The CallMethodV routine accepts the arguments, and, in turn, passes them to the Java method that the programmer wishes to invoke.”
  3. Call<type>MethodA(jobject obj, jmethodID methodID, const jvalue * args) 哎!这个我知道可以说两句 LOL ~~这里的 jvalue 通过查代码发现就是 JNI 中各个数据类型的 union,所以可以使用任何类型复制!所以参数的传入方式是通过一个 jvalue 的数组,数组内的元素可以是任何 jni 类型。

然后问题又来了:(挖掘机技术到底哪家强?!o(*≧▽≦)ツ┏━┓) 如果传进来的参数和java声明的参数的不一致会怎么样!(即不符合方法签名)这里文档中没用明确解释,但是说道: > Exceptions raised during the execution of the Java method.

typedef union jvalue {
    jboolean z;
    jbyte    b;
    jchar    c;
    jshort   s;
    jint     i;
    jlong    j;
    jfloat   f;
    jdouble  d;
    jobject  l;
} jvalue;

1. 调用实例方法(instance method):

  • <type> Call<type>Method(jobject obj, jmethodID methodID, ...); 调用一个具有<type>类型返回值的方法。
  • <type> Call<type>MethodV(jobject obj, jmethodID methodID, va_list args);
  • Call<type>MethodA(jobject obj, jmethodID methodID, const jvalue * args)

2. 调用静态方法(static method):

  • <type> CallStatic<type>Method(jobject obj, jmethodID methodID, ...);
  • <type> CallStatic<type>MethodV(jobject obj, jmethodID methodID, va_list args);
  • CallStatic<type>MethodA(jobject obj, jmethodID methodID, const jvalue * args)
3. 调用父类方法(super.method),这个就有点不一样了。多了一个 jclass 参数,jclass 可以使 obj 的父类,也可以是 obj 自己的class,但是 methodID 必须是从 jclass 获取到的,这样就可以调用到父类的方法。
  • <type> CallNonvirtual<type>Method(jobject obj, jclass clazz, jmethodID methodID, ...)
  • <type> CallNonvirtual<type>MethodV(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args);
  • <type> CallNonvirtual<type>MethodA(JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, const jvalue *args);

编程开发网
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Ubuntu下面MySQL的参数文件my.cnf.. 下一篇Java中如何模拟真正的同时并发请..