JNI
을 Android
에 사용하여 인스턴스 메소드를 호출하려고합니다. 모든 코드가 컴파일되지만 프로젝트의 내용을 보호하기 위해 코드의 관련 부분 만 표시합니다. 다음 코드 블록 (C++ 파일에 사용 된 extern c
)은 cls의 정적 메서드 [public String getMyString()
]에 액세스하려고 시도합니다. 나는 그 cls과 env가 null가 아니라는 것을 알고있다. 중반은 0으로 설정되지 않으며 null도 아닙니다.JNI NoSuchMethodException : 매개 변수 유형이 null입니다.
jmethodID mid = env->GetMethodID(cls, "getMyString", "()Ljava/lang/String;");
if (mid == 0) {
__android_log_write(ANDROID_LOG_INFO, "JNI", "mid is 0");
}
else {
__android_log_write(ANDROID_LOG_INFO, "JNI", "mid is not 0");
}
jstr = (jstring) env->CallObjectMethod(obj, mid);
if (jstr == NULL) {
__android_log_write(ANDROID_LOG_INFO, "JNI", "jstr is NULL");
}
else {
__android_log_write(ANDROID_LOG_INFO, "JNI", "jstr is not NULL");
}
printf(" c.s = \"%s\"\n", env->GetStringUTFChars(jstr, NULL));
return jstr;
비록 Class.java을 다음과 같이 오류가 발생
02-22 10:38:36.010: E/AndroidRuntime(17894): FATAL EXCEPTION: GLThread 10
02-22 10:38:36.010: E/AndroidRuntime(17894): java.lang.NoSuchMethodException: parameter type is null
02-22 10:38:36.010: E/AndroidRuntime(17894): at java.lang.ClassMembers.getConstructorOrMethod(ClassMembers.java:228)
02-22 10:38:36.010: E/AndroidRuntime(17894): at java.lang.Class.getMethod(Class.java:904)
02-22 10:38:36.010: E/AndroidRuntime(17894): at com.example.android.MyClass.getMyString(Native Method)
02-22 10:38:36.010: ...
코드 :이 기본 방법은 자바 측에 반환 할 때, 나는 (Class.java 다시 추적) 다음 오류 , 나는 그것이 내가 돌아 오는 JSTR 잘못된 방법 또는 을 찾는 중반 기능과 더 많은 관계를 가지고있다 느낌이있다가 널Class<?>[]
에 (반사 공통)의 캐스팅에 문제가 제시하는 것 ncorrectly (logcat에 jstr이 null이 아님).
마지막으로, 자바 측 관련 코드는 다음입니다 같이
네이티브 전화 :
public static native String getMyNativeString();
네이티브 메소드를 호출 :
String myStr = callGetMyNativeString();
방법되고있는 액세스 된 주소 :
public String getMyString() {
return "Foobar";
}