2012-02-22 4 views
0

JNIAndroid에 사용하여 인스턴스 메소드를 호출하려고합니다. 모든 코드가 컴파일되지만 프로젝트의 내용을 보호하기 위해 코드의 관련 부분 만 표시합니다. 다음 코드 블록 (C++ 파일에 사용 된 extern c)은 cls의 정적 메서드 [public String getMyString()]에 액세스하려고 시도합니다. 나는 그 clsenv가 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"; 
} 

답변

0

전체 자바 코드를 보지 않고서는이 사실을 확신 할 수 없습니다. 그러나 네이티브 메소드는 정적으로 정의되고 있으며, 자바 메소드 getMyString()은 비 정적입니다. 그래서 JNI에서 objgetMyString()으로 전화해야 했습니까?

관련 문제