无法从 JNI GetMethodId 函数获取值
Unable to get value from JNI GetMethodId function
我无法调用 .cpp 文件中的 java 方法。 JNI 函数 GetMethodID returns 空值。
我的 .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;
}
}
我正在 activity 侧
的按钮单击中访问此本机功能
public void onClick(View v) {
// connectedState(connect);
boolean b= getJniString();
}
我在 getJniString() 的本机方法中的 connectionState 变量中得到空值。
字段类型Ljava/lang/String;
错误,因为Java方法接受Z
boolean
.
一个(Z)
意味着它接受一个boolean
参数。
另一个Z
意味着它有一个boolean
return值。
大概是这样的:
jclass cls = env->FindClass("com/android/myapplication/MainActivity");
jmethodID mid = env->GetMethodID(cls, "connectedState", "(Z)Z");
jobject result = env->CallObjectMethod(cls, mid, true);
并且您必须在 return 之前将(最终)returned boolean
转换为 (jboolean)
。
参见 Chapter 4. The class File Format,低于 "field descriptors"。
我无法调用 .cpp 文件中的 java 方法。 JNI 函数 GetMethodID returns 空值。
我的 .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;
}
}
我正在 activity 侧
的按钮单击中访问此本机功能public void onClick(View v) {
// connectedState(connect);
boolean b= getJniString();
}
我在 getJniString() 的本机方法中的 connectionState 变量中得到空值。
字段类型Ljava/lang/String;
错误,因为Java方法接受Z
boolean
.
一个
(Z)
意味着它接受一个boolean
参数。另一个
Z
意味着它有一个boolean
return值。
大概是这样的:
jclass cls = env->FindClass("com/android/myapplication/MainActivity");
jmethodID mid = env->GetMethodID(cls, "connectedState", "(Z)Z");
jobject result = env->CallObjectMethod(cls, mid, true);
并且您必须在 return 之前将(最终)returned boolean
转换为 (jboolean)
。
参见 Chapter 4. The class File Format,低于 "field descriptors"。