0x00 JNI预备知识

1.JNI结构体指针及用法

在C中是二级指针,在C++中是一级指针。指向一堆定义好的函数(详情见oralcle官网https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#wp9502 ),我们只需拿到JNIEnv的指针即可调用足够量的函数,沟通java和c层的代码。

C中调用示例:

JNIEXPORT void JNICALL
Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj, jint depth) {
  jclass cls = (*env)->GetObjectClass(env, obj);
  jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");
  if (mid == 0) return;
  (*env)->CallVoidMethod(env, obj, mid, depth);
}

C++中调用示例:

**- C++中有this指针,所以方法中不用传入env **

JNIEXPORT void JNICALL
Java_Callbacks_nativeMethod(JNIEnv *env, jobject obj, jint depth) {
  jclass cls = env->GetObjectClass(obj);
  jmethodID mid = env->GetMethodID(cls, "callback", "(I)V");
  if (mid == 0) return;
  env->CallVoidMethod( obj, mid, depth);
}

2.函数签名

a. 基本类型

源码中jvalue结构体是这样定义的,看了后面的篇章的示例后会更加明白如何应用。


typedef union jvalue { 

jboolean z; 

jbyte b; 

jchar c; 

jshort s; 

jint i; 

jlong j; 

jfloat f; 

jdouble d; 

jobject l; 

} jvalue;

b. 特殊字符转义(Escape Sequence)

_0XXXX (XXXX是一个Unicode字符),当XXXX字母小写时,表示一个非ASCII的字符转义。例, _0abcd vs _0ABCD,前者为转义。

1 表示 “

_2 表示 “;”

_3 表示 “[“

    原文作者:lc_fan
    原文地址: https://www.jianshu.com/p/2c48907002e7
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞