NDK开发之调用方法
2015-09-05 13:50
405 查看
与NDK开发之访问域中介绍的一样,Java中的方法也是分为两类:实例方法和静态方法。JNI提供了访问两类方法的函数,下面我们一起来看看怎么在C中访问Java中的方法。
我们的MainActivity中有两个方法,分别是:
那么我们该怎么在C中访问这两个方法呢?
步骤和访问域是一样的:
1.通过对象引用获得类
2.通过类获得方法ID
3.通过方法ID调用方法
下面按步骤来
1.通过对象引用获得类
2.通过类获得方法ID
JNI提供了用方法ID访问两类方法的途径,可以用给定实例的class对象获得方法ID,用GetMethodID函数获得实例方法的方法ID。与字段ID获取方法一样,两个函数的最后一个参数均表示方法描述符,在Java中它们表示方法签名。(为了提高应用性能,我们可以缓存方法ID)
3.通过方法ID调用方法
为了查看是否调用成功,我们需要把调用结果打印出来:
完整代码是这样的:
打印结果:
Java和C之间的转换时代价较大的操作,在实际开发中我们应该尽量避免这种情况的出现。
我们的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之间的转换时代价较大的操作,在实际开发中我们应该尽量避免这种情况的出现。
相关文章推荐
- 联考1day1总结
- 终于看到配置成功的Android模拟器是什么样子
- shell中的特殊符号总结
- json序列化与反序列化
- mysql + unidac 使用事务例子
- varnish 页面跳转
- 条款17 以独立语句将new对象置入智能指针
- quick-cocos2d-x数据存储之GameState
- spring Bean的生命周期
- 《剑指Offer》面试题:合并两个排序的链表
- linux配置java环境变量(详细)
- 哗啦啦族的24点游戏(DFS)
- hdu 2577 dp
- 第10章 信号
- 野人学Android基础篇之四大组件第一课--Activity的Intent传递
- Linux下JDK环境变量配置
- 黑马程序员java之网络通讯
- JavaScript四种跨域方式详解
- 命运永远都掌握在我们自己的手中
- android学习笔记(15)Android消息机制