JNI_OnLoad错误:无法使用signature()Ljava / lang / String查找本机函数的decl

时间:2011-06-21 16:49:27

标签: java java-native-interface swig

我目前正在使用SWIG / jni从java为Android应用程序调用C ++函数。但是,只要函数返回jstring,我就会遇到困难。在应用程序启动时,我在LogCat中收到以下错误......

错误:无法为本机Lcom / example / swigJNI找到decl; .plugin_name:L()java / lang / String

错误:无法为本机Lcom / example / swigJNI找到decl; .plugin_description:L()java / lang / String

以下是一些可能有用的代码...

SWIG生成的包装代码:

 SWIGEXPORT jstring JNICALL Java_swigJNI_1plugin_1name(JNIEnv *jenv, jclass jcls) {
  jstring jresult = 0 ;
  char *result = 0 ;

  (void)jenv;
  (void)jcls;
  result = (char *)plugin_name();
  if (result) jresult = jenv->NewStringUTF((const char *)result);
  return jresult;
}


SWIGEXPORT jstring JNICALL Java_swigJNI_1plugin_1description(JNIEnv *jenv, jclass     jcls) {
  jstring jresult = 0 ;
  char *result = 0 ;

  (void)jenv;
  (void)jcls;
  result = (char *)plugin_description();
  if (result) jresult = jenv->NewStringUTF((const char *)result);
  return jresult;
}

JNI原生方法声明:

static const JNINativeMethod methods[] = {
    {"plugin_name", "()Ljava/lang/String", (void*) Java_swigJNI_1plugin_1name},
    {"plugin_description", "()Ljava/lang/String", (void*) Java_swigJNI_1plugin_1description}
};

当函数返回int时,我已成功执行JNI_onLoad()和RegisterNatives(),但字符串对我来说是个问题。我不太明白这些功能是如何找不到的。有什么东西我不见了吗?

2 个答案:

答案 0 :(得分:2)

啊,我觉得自己像个笨蛋!

我用于字符串的签名是......

()Ljava/lang/String

什么时候真的应该......

()Ljava/lang/String;

忘了分号。的Ack!

答案 1 :(得分:0)

您是将java类的头文件(生成的c头文件)放在c ++代码中,其中定义了本机方法。

所以,生成一个C头文件,其中包含本机方法实现的函数原型