我无法在.cpp文件中调用Java方法。 JNI函数GetMethodID返回空值。
我的.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\n", str);
if(str) {
//return (env)->NewStringUTF("Open Success");
return str;
}
}
我正在通过活动侧的按钮单击访问此本机功能
public void onClick(View v) {
// connectedState(connect);
boolean b= getJniString();
}
我在getJniString()的本机方法中的connectionState变量中获取空值。
答案 0 :(得分:3)
字段类型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。