我尝试为我的应用程序使用pocketsphinx包,并需要将demo package名称重命名为有用的名称(例如com.myname.foo)
我花了好几个小时搞清楚,但我根本无法让它发挥作用。
问题是,如果我保留包名并且没有任何问题(除了随机崩溃),项目运行正常,但是当我重命名它时,我得到错误
FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: new_Config__SWIG_0
我已经尝试修改Swig命令,但它也没有用。
有什么想法吗?
我只更改了Manifest的包名声明和普通Activity的包文件夹。
答案 0 :(得分:6)
您需要在c / c ++方面进行更改,这取决于您的JNI的实现方式,有两种可行的方式。
一个。函数名称包含完整的类路径
JNIEXPORT jlong JNICALL Java_"package with underscore instead of .""class""method"(JNIEnv *env, jclass class,...
e.g。
JNIEXPORT jlong JNICALL Java_com_android_mms_transaction_NativeSms_send(JNIEnv *env, jclass class,...
匹配方法在包com.android.mms.transaction
中的类NativeSms中发送B中。有一个字符串通过类路径提供回dalvik / javaVM。寻找像这样的东西:
static int registerMethods(JNIEnv* env) {
static const char* const kClassName =
"com/example/android/platform_library/PlatformLibrary";
jclass clazz;
/* look up the class */
clazz = env->FindClass(kClassName);
if (clazz == NULL) {
LOGE("Can't find class %s\n", kClassName);
return -1;
}
/* register all the methods */
if (env->RegisterNatives(clazz, gMethods,
sizeof(gMethods) / sizeof(gMethods[0])) != JNI_OK)
{
LOGE("Failed registering methods for %s\n", kClassName);
return -1;
}
...
编辑2011-12-07澄清第一个例子
答案 1 :(得分:2)
Sooo,我发现了问题;我花了20个小时才发现,我实际上忘了添加
static {
System.loadLibrary("pocketsphinx_jni");
}
到Activity类。我不敢相信我没有看到,但感谢所有答案!为每个人帮助我+1:]
答案 2 :(得分:1)
如果您有链接命令问题,则很可能您忘记更改SWIG启动属性。该文件是
.externalToolBuilders / SWIG.launch
这些属性有几个地方提到edu.cmu.sphinx包。
如果您更改了某些内容,建议您更准确地描述更改。很可能你只是忘记了一些小事。例如,您可以将整个更改的代码打包到存档中并将其上传到某处。