我在JNI代码中收到此错误,而我尝试使用GetMethodID找到方法,我的Java方法在接口中。
这是我的界面
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工具生成。
感谢您输入/评论并帮助修复此错误。
答案 0 :(得分:1)
在JNI方法调用中保存JNIEnv*
无效。它仅适用于您当前使用的JNI方法的持续时间。在任意C ++代码中,您需要调用AttachCurrentThread()
来获取当前有效的JNIEnv*
。
但是可以缓存methodID。没有必要每次都查找它。在构造函数中查找。