您的位置:首页 > 其它

NDK开发之调用方法

2015-09-05 13:50 405 查看
NDK开发之访问域中介绍的一样,Java中的方法也是分为两类:实例方法和静态方法。JNI提供了访问两类方法的函数,下面我们一起来看看怎么在C中访问Java中的方法。

我们的MainActivity中有两个方法,分别是:

private String instanceMethod(){
return "Instance Method";
}
private static String staticMethod(){
return "static Method";
}


那么我们该怎么在C中访问这两个方法呢?

步骤和访问域是一样的:

1.通过对象引用获得类

2.通过类获得方法ID

3.通过方法ID调用方法

下面按步骤来

1.通过对象引用获得类

clazz = (*env)->GetObjectClass(env, thiz);


2.通过类获得方法ID

JNI提供了用方法ID访问两类方法的途径,可以用给定实例的class对象获得方法ID,用GetMethodID函数获得实例方法的方法ID。与字段ID获取方法一样,两个函数的最后一个参数均表示方法描述符,在Java中它们表示方法签名。(为了提高应用性能,我们可以缓存方法ID)

instanceMethodID = (*env)->GetMethodID(env, clazz, "instanceMethod",
"()Ljava/lang/String;");
staticMethodID = (*env)->GetStaticMethodID(env, clazz, "staticMethod",
"()Ljava/lang/String;");


3.通过方法ID调用方法

instanceMethodResult = (*env)->CallObjectMethod(env,thiz,instanceMethodID);
staticMethodResult = (*env)->CallStaticObjectMethod(env,clazz,staticMethodID);


为了查看是否调用成功,我们需要把调用结果打印出来:

const jbyte* str1;
const jbyte* str2;
str1 = (*env)->GetStringUTFChars(env, instanceMethodResult, 0);
str2 = (*env)->GetStringUTFChars(env, staticMethodResult, 0);
LOGI("the string is :%s", str1);
LOGI("the string is :%s", str2);


完整代码是这样的:

void Java_com_example_jni_MainActivity_getMethod(JNIEnv* env, jobject thiz) {
jclass clazz;
jmethodID instanceMethodID;
jmethodID staticMethodID;
jstring instanceMethodResult;
jstring staticMethodResult;
clazz = (*env)->GetObjectClass(env, thiz);
// clazz = (*env)->FindClass(env,"com/example/jni/JavaClass");
instanceMethodID = (*env)->GetMethodID(env, clazz, "instanceMethod", "()Ljava/lang/String;"); staticMethodID = (*env)->GetStaticMethodID(env, clazz, "staticMethod", "()Ljava/lang/String;");
instanceMethodResult = (*env)->CallObjectMethod(env,thiz,instanceMethodID); staticMethodResult = (*env)->CallStaticObjectMethod(env,clazz,staticMethodID);
//jstring转为C字符串然后打印出来
const jbyte* str1;
const jbyte* str2;
str1 = (*env)->GetStringUTFChars(env, instanceMethodResult, 0);
str2 = (*env)->GetStringUTFChars(env, staticMethodResult, 0);
LOGI("the string is :%s", str1);
LOGI("the string is :%s", str2);
}


打印结果:



Java和C之间的转换时代价较大的操作,在实际开发中我们应该尽量避免这种情况的出现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: