native调用java中的方法

2018-03-28  本文已影响0人  To_Be_Better

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

JNIEnv

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

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层代码

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的三个方法

调用方法的三种形式

jvalue * args = new jvalue[3]
args[0]=1
args[1] = 2.1
args[3] = "str"
上一篇 下一篇

猜你喜欢

热点阅读