1

我尝试为我的应用程序使用 pocketsphinx 包,并且需要将演示包名称重命名为有用的名称(例如 com.myname.foo)

我花了几个小时弄清楚,但我根本无法让它发挥作用。

问题是,如果我留下包名并且没有任何问题(除了随机崩溃),项目运行良好,但是当我重命名它时,我得到了错误

FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: new_Config__SWIG_0

我已经尝试过修改 Swig 命令,但也没有用。

有任何想法吗?

我只更改了Manifest的包名声明和正常Activity的包文件夹。

4

3 回答 3

6

您需要在 c/c++ 方面进行更改,根据 JNI 的实现方式,有两种可能的方式。

A. 函数名包含完整的类路径

    JNIEXPORT jlong JNICALL Java_"package with underscore instead of .""class""method"(JNIEnv *env, jclass class,...

例如

    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 澄清第一个例子

于 2011-12-07T14:14:24.930 回答
2

Sooo,我发现了问题;我花了 20 个小时才发现,我实际上忘了添加

static {
    System.loadLibrary("pocketsphinx_jni");
}

到 Activity 类。我不敢相信我没有看到,但感谢所有的答案!为每个帮助我的人 +1 :]

于 2011-12-08T12:51:43.107 回答
1

如果您有链接命令问题,很可能您忘记更改 SWIG 启动属性。该文件是

.externalToolBuilders/SWIG.launch

那些属性有几个地方提到了edu.cmu.sphinx 包。

如果您更改了某些内容,建议更准确地描述更改。很可能你只是忘记了一些小事。例如,您可以将整个更改的代码打包到存档中并上传到某个地方。

于 2011-12-07T22:15:13.553 回答