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 表示 “[“

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 什么是JNI? JNI 是java本地开发接口.JNI 是一个协议,这个协议用来沟通java代码和外部的本地代码(...
    a_tomcat阅读 2,848评论 0 54
  • _ 声明: 对原文格式以及内容做了细微的修改和美化, 主要为了方便阅读和理解 _ 一. 基础 Java Nativ...
    元亨利贞o阅读 6,001评论 0 34
  • 译文地址:http://docs.oracle.com/javase/1.5.0/docs/guide/jni/s...
    一根烟的弹跳阅读 2,124评论 0 0
  • …………话思念………… ……送卌四年未见的雪辉 …………臧明魁………… 独在异乡夜不寐, 人生几彷徨? 凉风瑟瑟泪...
    日月鬼斗阅读 236评论 0 0
  • 管理者必须卓有成效 管理者必须卓有成效,否则就对不起自己服务的组织。组织借助管理者的成效服务于客户,得到经济效益和...
    Marymlj阅读 203评论 0 0