native调用java中的方法

之前已经知道了如何在java层调用native层的代码。现在就来了解一下native层如何调用java层

JNIEnv

JNIEnv类型代表了java环境,通过JNIEnv*指针就可以对Java端代码进行操作。
JNIEnv类中的一些函数如下:

  • NewObject:创建Java类中的对象
  • NewString:创建Java类中的String对象
  • New<Type>Array:创建类型为Type的数组对象
  • Get<Type>Field:获取类型为Type的字段
  • Set<Type>Field:设置类型为Type的字段
  • GetStatic<Type>Field:获取类型为Type的static字段
  • SetStatic<Type>Field:设置类型为Type的static字段
  • GetFieldID:获取java属性 对应jfieldID
  • GetMehtodID:获取java函数ID 对应jmethodID
  • Call<Type>Method:调用返回类型为Type的方法
  • CallStatic<Type>Method:调用返回类型为Type的static方法

jobject参数obj

如果native方法不是static,obj代表native方法的类实例
如果native方法是static,obj就代表nativve方法的类的class对象实例
GetFieldID(jclass clazz,const char* name,const char* sign)
clazz:依赖类对象的class对象
name:这个字段的名称
sign:这个字段的签名
查看类的签名用javap -s -p HelloTest.java

实例讲解

需要被调用的java代码

public class HelloTest {
    public int c;
    public  int add(int a,int b){
        return a+b;
    }
    public void setC(int c) {
        this.c = c;
    }
}

native调用java层代码

  • 获取类实例
  • 获得构造函数
  • 创建对象
  • 获得方法ID
  • 调用方法
JNIEXPORT void JNICALL Java_com_example_jnitest_JniUtils_CcallJava(JNIEnv *env, jobject obj){
    jclass hellotest_clazz = env->FindClass("com/example/jnitest/HelloTest");//获取类hellotest类
    jmethodID construction_id = env->GetMethodID(hellotest_clazz,"<init>", "()V");//获取构造函数
    jobject hellotest_obj = env->NewObject(hellotest_clazz,construction_id);//创建对象
    jmethodID methodId_add = env->GetMethodID(hellotest_clazz,"add","(II)I");//获取add method
    jint result = env->CallIntMethod(hellotest_obj,methodId_add,1,2);//调用add
    LOGI("1 add 2 = %d.\n",result);
    jmethodID methodId_setC = env->GetMethodID(hellotest_clazz,"setC","(I)V");
    env->CallVoidMethod(hellotest_obj,methodId_setC,1L);
    jfieldID fieldId_prop = env->GetFieldID(hellotest_obj,"c","I");
    jint prop = env->GetIntField(hellotest_clazz,fieldId_prop);
    LOGI("TAGCcallJava: hellotest's C is %d\n",prop);
}

获得jclass的三个方法

  • FindClass(const char* clsName):通过类的名称全称来获得jclass。如:jclass str = env->FindClass("java/lang/String")获得String的class对象
  • GetObjectClass(jobject obj):通过对象实例来获取jclass,相当于java中的getClass方法
  • GetSuperClass:获得父类的jclass对象。

调用方法的三种形式

  • Call<Type>Method(jobject obj,jmethodID id,参数)
  • Call<Type>Method(jobject obj,jmethodID id,va_list lst)
  • Call<Type>Method(jobject obj,jmethodID id,jvalue* v)
    第三种为jvalue的数组
jvalue * args = new jvalue[3]
args[0]=1
args[1] = 2.1
args[3] = "str"
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • 什么是JNI? JNI 是java本地开发接口.JNI 是一个协议,这个协议用来沟通java代码和外部的本地代码(...
    a_tomcat阅读 2,816评论 0 54
  • 原链接:http://www.ibm.com/developerworks/cn/java/j-jni/ 使用 J...
    王朋6阅读 7,662评论 0 8
  • 现在,你知道了如何通过JNI来访问JVM中的基本类型数据和字符串、数组这样的引用类型数据,下一步就是学习怎么样和J...
    738bc070cd74阅读 877评论 0 1
  • 一觉醒来,满屏都是艺人王宝强的离婚撕逼大战。 别说在娱乐圈里,就算普通人离个婚,本来也稀松平常,但是这一对公开对骂...
    安桐2016阅读 672评论 0 1
  • 2018年的第一个月已经过了半个月了。时间过得很快,因为时间对你很重要。 你们有没有对2018年做个整体的规划呢?...
    一托无忧阅读 168评论 0 0