2011-12-07 141 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