无法从JNI GetMethodId函数中获取值[关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法从JNI GetMethodId函数中获取值[关闭]相关的知识,希望对你有一定的参考价值。
我无法在.cpp文件中调用java方法。 JNI函数GetMethodID返回null值。
我的.java文件:
public boolean connectedState(boolean status) {
return status;
}
我的.cpp文件:
extern "C"
JNIEXPORT jboolean
JNICALL Java_com_android_myapplication_MainActivity_getJniString( JNIEnv* env, jobject obj){
jstring jstr = (env)->NewStringUTF("This comes from jni.");
jclass cls=(env)->GetObjectClass(obj);
jclass clazz = (env)->FindClass("com/android/myapplication/MainActivity");
jmethodID connectionState = env->GetMethodID(clazz, "connectedState","(Ljava/lang/String;)Z");
jobject result = (env)->CallObjectMethod( obj, connectionState, true);
const jboolean str = (env)->GetBooleanField(result, NULL); // should be released but what a heck, it's a tutorial :)
// printf("%s
", str);
if(str) {
//return (env)->NewStringUTF("Open Success");
return str;
}
}
我在按钮单击活动端访问此本机功能
public void onClick(View v) {
// connectedState(connect);
boolean b= getJniString();
}
我在getJniString()的本机方法中的connectionState变量中获取null值。
答案
字段类型Ljava/lang/String;
是错误的,因为Java方法接受Z
boolean
。
- 一个
(Z)
的意思是,它接受boolean
论证。 - 另一个
Z
的意思是,它有一个boolean
返回值。
它可能是这样的:
jclass cls = env->FindClass("com/android/myapplication/MainActivity");
jmethodID mid = env->GetMethodID(cls, "connectedState", "(Z)Z");
jobject result = env->CallObjectMethod(cls, mid, true);
并且你必须在返回之前将(最终)返回的boolean
投射到(jboolean)
。
请参阅“字段描述符”下方的Chapter 4. The class File Format。
以上是关于无法从JNI GetMethodId函数中获取值[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Android jni GetFieldID 和 GetMethodID 函数的说明
使用挂起异常java.lang.ClassNotFoundException调用JNI GetMethodID
从本机 c 代码 (JNI) 为 Java 中的回调函数传递多个参数