更改软件包名称会破坏JNI

问题描述 投票:1回答:4

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

我花了数小时来弄清楚,但我根本无法使它正常工作。

问题是,如果我保留程序包名称并且项目可以正常运行(除了随机崩溃),项目运行正常,但是当我重命名它时,我得到了错误

FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: new_Config__SWIG_0

我已经尝试过修改Swig命令,但是它也不起作用。

有什么想法吗?

我只更改了清单的程序包名称声明和普通Activity的程序包文件夹。

android java-native-interface cmusphinx
4个回答
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阐明第一个示例


2
投票

所以,我发现了问题;我花了20个****小时的时间才发现,但实际上我忘了添加

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

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


1
投票

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

。externalToolBuilders / SWIG.launch

这些属性在很多地方都提到edu.cmu.sphinx包。

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


0
投票

有人可以告诉我答案吗?>

我在反射器出现后,在我的jni_part.cpp文件中有@zingo答案给出的A类型问题,并且程序包名称停止工作,我用_而不是将jni_part.cpp中的名称更改为新的程序包名称。但仍然无法正常工作,请帮助

© www.soinside.com 2019 - 2024. All rights reserved.