2013-11-01 5 views
0

GetMethodID를 사용하여 메서드를 찾으려고 시도하는 동안 JNI 코드에이 오류가 발생했습니다. Java 메서드가 인터페이스에 있습니다. 여기 JNI 메서드를 찾을 수 없습니다.

내 인터페이스

public interface printReader 
{ 

public printImg readerPrint(String selectedName) throws Exception; 

} 

네이티브 코드

WprintImgIMPL.h 
class WprintImgIMPL: public IWprintReader { 

public: 

    WprintImgIMPL(JNIEnv *env, jobject obj); 
    ~WprintImgIMPL(void); 

virtual WprintImg readerPrint(char* readerName) ; 
    ..... 
    ..... 
private: 
    JNIEnv *m_Env; 
    jobject m_jObj; 
} 

WprintImgIMPL.cpp 
WprintImg WprintImgIMPL::readerPrint(char* readerName) { 
jclass cls = m_Env->GetObjectClass (m_jObj); 

jmethodID mid = m_Env->GetMethodID (cls, "readerPrint", "(Ljava/lang/String;)Lcom/site/name/printImg;"); 
....... 
....... 
} 

자바 코드

public class printReaderIMPL implements printReader { 
static final String DEBUG_TAG = ""; 
android.net.wifi.WifiManager.MulticastLock lock; 

Context _context; 

public printReaderIMPL (Context context) { 
    _context = context; 
} 

@Override 
public printImg readerPrint(String selectedName) throws Exception { 

    Log.e(DEBUG_TAG, "readerPrint"); 
    } 
} 

생성자/소멸자

WprintImgIMPL(JNIEnv *env, jobject obj){ 
    m_Env = env; 
    m_jobj = env->NewGlobalRef(obj); 

    } 
    ~WprintImgIMPL(void) { 
    m_Env->DeleteGlobalRef(m_jobj); 
    } 

Error: GetMethodID: method not found: Lcom/site/name/NativeCode;.printImg:(Ljava/lang/String;)Lcom/site/name/printImg; 
입니다

서명을 두 번 확인했습니다. 실패 후 Javap 도구를 사용하여 다시 생성했습니다.

이 버그를 수정/입력하고 도움을 주셔서 감사합니다.

+1

.h 파일의 선언은 어떻게됩니까? 그리고 .c 파일? 그들은 동의합니까? – EJP

+0

다시 질문하십시오. 원시 코드도 추가했습니다. –

+0

그리고 예 그들은 코드 컴파일/링크를 잘 동의하지만 GetMethodID에서 충돌 한 메서드를 찾을 수 없습니다. –

답변

1

JNIEnv*을 JNI 메소드 호출에 저장할 수 없습니다. 현재 사용중인 JNI 메소드의 지속 기간에만 유효합니다. 임의의 C++ 코드에서 현재 유효 JNIEnv*을 얻으려면 AttachCurrentThread()으로 전화해야합니다.

그러나 수 있습니다 methodID를 캐시하십시오. 매번 그것을 들여다 볼 필요가 없습니다. 당신의 생성자에서 찾아보십시오.

+0

예, WprintImgIMPL의 객체를 WprintImgIMPL (JNIEnv * env, jobject obj)을 nativeObj-> registerPrintImg (printImge)와 같은 기본 객체에 사용하여 WprintImgIMPL의 객체를 등록했습니다. 여기서 printImge는 WprintImgIMPL의 객체입니다. 내 원시 코드 Javah 헤더 코드를 생성했습니다. –

+0

내 nativeObj를 원시 코드로 전역으로 유지하는 것이 의심 스럽지만 Java/JVM에 대한 지식이 없으므로 그게 문제 일까? nativeObj-> registerCPlusPlusCode처럼 native 등록 함수의 나머지는 정상적으로 작동합니다. –

+0

@SelectCall 편집을 참조하십시오. – EJP

관련 문제