我目前正在使用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(),但字符串对我来说是个问题。我不太明白这些功能是如何找不到的。有什么东西我不见了吗?
答案 0 :(得分:2)
我用于字符串的签名是......
()Ljava/lang/String
什么时候真的应该......
()Ljava/lang/String;
忘了分号。的Ack!
答案 1 :(得分:0)
您是将java类的头文件(生成的c头文件)放在c ++代码中,其中定义了本机方法。
所以,生成一个C头文件,其中包含本机方法实现的函数原型