>백엔드 개발 >C++ >Android에서 C에서 Java 메소드를 호출할 때 \'java.lang.NoSuchMethodError: messageMe\'를 수정하는 방법은 무엇입니까?

Android에서 C에서 Java 메소드를 호출할 때 \'java.lang.NoSuchMethodError: messageMe\'를 수정하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-03 12:15:02957검색

How to Fix

Android의 C에서 Java 메서드 호출: 자세한 안내

C에서 Java 메서드를 호출하는 것은 Android 개발의 일반적인 작업입니다. 이 글의 목적은 Java 및 C 코드를 자세히 살펴보고 이 프로세스 중에 발생할 수 있는 일반적인 오류를 해결하여 이 문제에 대한 포괄적인 솔루션을 제공하는 것입니다.

Java 코드 설정

제공된 Java 코드는 C에서 문자열을 반환하는 getJniString() 메서드를 사용하여 MainActivity라는 클래스를 정의합니다. C에서 호출하려는 messageMe() 메소드는 수신된 텍스트를 간단히 인쇄합니다.

<code class="java">public class MainActivity extends Activity {
    ...
    public void messageMe(String text) {
        System.out.println(text);
    }
    ...
}</code>

C 코드

native.cpp의 C 코드 MainActivity 클래스를 찾고, messageMe() 메서드를 검색하고, jstr 문자열 개체에서 호출하려고 시도합니다. 그러나 오류 메시지 "java.lang.NoSuchMethodError: messageMe"는 messageMe() 메서드를 찾을 수 없음을 나타냅니다.

<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
    jstring jstr = env->NewStringUTF("This string comes from JNI");
    jclass clazz = env->FindClass("the/package/MainActivity");
    jmethodID messageMe = env->GetMethodID(clazz, "messageMe", "(Ljava/lang/String;)V");
    env->CallObjectMethod(jstr, messageMe);
    ...
}</code>

수정

오류 두 가지 문제로 인해 발생합니다:

  • 잘못된 객체 호출: messageMe() 메서드에는 CallObjectMethod()의 첫 번째 인수로 전달되어야 하는 객체 참조가 필요합니다. 잘못된 코드는 jstr에서 메소드를 직접 호출하는데 이는 유효하지 않습니다.
  • 잘못된 JNI 서명: C 코드는 (Ljava/lang/String;)V를 messageMe( ) 메서드는 void를 반환함을 나타냅니다. 그러나 실제 Java 메소드는 문자열 값을 반환합니다. 이 문제를 해결하려면 C 코드를 다음과 같이 변경하세요.
<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
    jstring jstr = env->NewStringUTF("This string comes from JNI");
    ...
    jstring result = env->CallObjectMethod(obj, messageMe, jstr);
    ...
}</code>

업데이트된 C 메서드

<code class="cpp">jstring Java_the_package_MainActivity_getJniString( JNIEnv* env, jobject obj, jint depth ){
    jstring jstr = env->NewStringUTF("This string comes from JNI");
    ...
    jstring result = env->CallObjectMethod(obj, messageMe, jstr);
    const char* str = env->GetStringUTFChars(result, NULL);
    printf("%s\n", str);
    ...
}</code>

결론

객체 호출 및 JNI 서명 불일치 문제를 해결함으로써 C 코드에서 messageMe() 메서드를 성공적으로 호출할 수 있습니다.

위 내용은 Android에서 C에서 Java 메소드를 호출할 때 \'java.lang.NoSuchMethodError: messageMe\'를 수정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.