2013-11-01 94 views
0

我一直在接收這個錯誤,我的JNI代碼,而我試圖找到方法,使用GetMethodID,我的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;"); 
....... 
....... 
} 

Java代碼

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

跨JNI方法調用保存JNIEnv*是無效的。它僅在您當前所處的JNI方法的持續時間內有效。在任意C++代碼中,您需要調用AttachCurrentThread()以獲取當前有效的JNIEnv*

但是你可以緩存methodID。沒有必要每次都查看它。在你的構造函數中查找它。

+0

是的,我同意了,我一直在使用構造函數WprintImgIMPL(JNIEnv * env,jobject obj)向nativeObj-> registerPrintImg(printImge)這樣的本機對象註冊WprintImgIMPL的對象,這裏的printImge是WprintImgIMPL的一個對象。我的本地代碼有Javah生成的頭文件代碼。 –

+0

我懷疑我的本地代碼保持nativeObj爲全局的,Java/JVM對此沒有任何認識,我不知道這是否是問題所在?然而,其他的本地註冊功能工作正常,如nativeObj-> registerCPlusPlusCode工作。 –

+0

@SelectCall請參閱編輯。 – EJP