Изменение названия пакета нарушает JNI - PullRequest
1 голос
/ 07 декабря 2011

Я пытаюсь использовать пакет pocketsphinx для моего приложения, и мне нужно переименовать демо-пакет в какое-нибудь полезное имя (например, com.myname.foo)

Я часами разбирался, но просто не могу заставить его работать.

Проблема в том, что проект работает нормально, если я оставляю имя пакета и работает без каких-либо проблем (кроме случайных сбоев), но когда я переименовываю его, я получаю ошибку

FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: new_Config__SWIG_0

Я уже пытался изменить команду Swig, но она тоже не сработала.

Есть идеи?

Я только изменил обозначение имени пакета манифеста и папку пакета обычной активности.

Ответы [ 3 ]

6 голосов
/ 07 декабря 2011

Вам необходимо изменить на стороне c / c ++ два возможных способа в зависимости от того, как реализован ваш JNI.

A. Имя функции содержит полный путь к классу <pre> JNIEXPORT jlong JNICALL Java_"package with underscore instead of ."<em>"class"</em>"method"(JNIEnv *env, jclass class,...

, например

<pre> JNIEXPORT jlong JNICALL Java_com_android_mms_transaction_NativeSms_send(JNIEnv *env, jclass class,...

метод сопоставления, отправленный в классе NativeSms в пакете com.android.mms.transaction

B. Есть строка, переданная обратно в dalvik / javaVM с помощью classpath. Ищите что-то вроде этого:



    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 голосов
/ 08 декабря 2011

ооо, я обнаружил проблему;Я трачу 20 **** часов, чтобы выяснить, что я действительно забыл добавить

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

в класс Activity.Не могу поверить, что не видел этого, но спасибо за все ответы!+1 за каждого, кто мне помогает:]

1 голос
/ 08 декабря 2011

Если у вас есть проблема с командой link, скорее всего, вы забыли изменить свойства запуска SWIG.Файл

.externalToolBuilders / SWIG.launch

В этих свойствах есть несколько мест, где следует упомянуть пакет edu.cmu.sphinx.

Если вы измениличто-то, что рекомендуется, чтобы описать изменения более точно.Скорее всего, вы просто забыли какую-то маленькую вещь.Например, вы можете упаковать весь измененный код в архив и загрузить его куда-нибудь.

...