2013-11-01 96 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