2011-12-07 144 views
1

我尝试使用pocketsphinx包我的应用程序,并需要重命名demo package名有用的东西(如com.myname.foo)更改包名称打破JNI

我花了几个小时就搞清楚,但我只是不能让它工作。

的问题是,该项目如果我离开包名称运行良好和(从随机崩溃分开)没有任何问题的作品,但是当我重新命名它,我得到的错误

FATAL EXCEPTION: main 
java.lang.UnsatisfiedLinkError: new_Config__SWIG_0 

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

任何想法?

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

+0

你试过更新Android.mk这是文件夹PocketSphinxDemo/jni ???您需要更新此文件中的路径。 – mhshams

+0

感谢您的回复,但就我而言,没有需要更改的路径,因为改变的唯一路径是'/ PROJECT/src/...'路径。 – Force

回答

2

Sooo,我找到了问题;我花了20个小时才发现,实际上我忘了将

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

添加到Activity类。我不能相信我没有看到,但感谢所有的答案! +1为大家帮助我:]

5

您需要在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,... 

匹配方法在类NativeSms发送在包com.android.mms.transaction

B.有供应回到达尔维克串/ 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澄清第一个例子

+0

我真的很希望这项工作,但遗憾的是在c方面没有这样的类路径:( 而就像我上面所说的,唯一改变的是Android的Manifest声明和源代码目录,但**不** JNI软件包名称... – Force

+0

但是,非常感谢您的回复! – Force

+0

查看您链接到的代码中有很多函数,如jni/pockectsphinx_wrap.c中的Java_edu_cmu_pocketsphinx_pocketsphinxJNI_Config_1exists()函数,它们与jni/edu中的函数/cmu/pocketspinx/pocketsphinxJNI.java like public final static native boolean Config_exists(long jarg1,Config jarg1_,String jarg2);(in class pocketsphinxJNI package edu.cmu.pocketsphinx) – zingo

1

如果您有链接指令的发布很可能是因为你忘了更改痛饮启动性能。该文件是

.externalToolBuilders/SWIG.launch

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

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

+0

通过Project/Builders/SWIG - > edit ;-)来更改启动参数会更容易我已经试过了,但这不是问题。虽然谢谢! – Force