首先来说下jni怎么调用java中的方法吧,近来才开始研究NDK,很多不顺啊
有大牛博客传送门:http://blog.sina.com.cn/s/blog_62b2318d0101h5j1.html
举个例子,
在我的java文件com/example/hellojni/HelloJni.java中有一个方法,是静态的
public static int add(int x, int y){
Toast.makeText(ctx, (x + y) + "~~~~" , Toast.LENGTH_SHORT).show();
return x+y;
}
那么在jni中调用的话,步骤是如下:
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
{
// 获取类
jclass AnalyzeCidUtil = (*env)->FindClass(env,"com/example/hellojni/HelloJni");
if (NULL == AnalyzeCidUtil) {
return (*env)->NewStringUTF(env, "-1");
}
// 获取类add静态方法
jmethodID add = (*env)->GetStaticMethodID(env,AnalyzeCidUtil, "add", "(II)I");
if (NULL == add) {
(*env)->DeleteLocalRef(env,AnalyzeCidUtil); // 删除类指引
return (*env)->NewStringUTF(env, "-2");
}
// 调用静态int方法
int result = (*env)->CallStaticIntMethod(env,AnalyzeCidUtil, add, 3, 5);
char str[] = "Hello from JNI ! ";
sprintf(str, "%s%d", str, result);
return (*env)->NewStringUTF(env, str);
}
我从网上拷贝下来运行,发现很正常,然后就阅读代码,发现其中有一个东西,完全不知道是啥:(II)I
也就是GetStaticMethodID方法的第三个参数
可能是少见多怪吧,这就是本文的重点咯
按照前面大牛的传送门的指导
我总结了下,这个(II)I其实就是我们要调用的方法的参数和返回值
前面的括号加上两个I表示:有两个参数,并且是INT类型
括号后面的I表示:返回值是INT类型
大牛在文章中还提到了,boolean类型对应的是Z,void对应的是V
结合以上,我做了一个统计,请看下图
其中主要要提防的是,如果是非基础类型的话,后面会多一个分号;
注意到就没事了
网友评论