找不到JNI方法

时间:2013-11-01 01:40:31

标签: android c++ interface android-ndk java-native-interface

我在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工具生成。

感谢您输入/评论并帮助修复此错误。

1 个答案:

答案 0 :(得分:1)

在JNI方法调用中保存JNIEnv*无效。它仅适用于您当前使用的JNI方法的持续时间。在任意C ++代码中,您需要调用AttachCurrentThread()来获取当前有效的JNIEnv*

但是可以缓存methodID。没有必要每次都查找它。在构造函数中查找。