Проблема с NDK - PullRequest
       17

Проблема с NDK

3 голосов
/ 27 апреля 2011

Я пытался заставить порт OpenAL для Android 2.2 работать через NDK, но я получаю сообщение об ошибке, которую не могу решить самостоятельно. Я объявил несколько собственных методов в своем классе Java:

/**
 * Creates a native OpenAL Audio player.
 * @return An int value according to if the action was a success or not.
 */
private native int initALPlayer();
/**
 * Writes raw PCM data to the OpenAL Audio player.
 * @param data
 * @return An int value according to if the action was a success or not.
 */
private native int writeAudio(byte[] data);
/**
 * Closes the native OpenAL Audio player.
 * @return An int value according to if the action was a success or not.
 */
private native int closeALPlayer();

Я загружаю правильные библиотеки через System.loadLibrary ():

static{
    System.loadLibrary("openal");
    System.loadLibrary("audio");
}

После этого я создал файл заголовка с помощью команды javah

javah -classpath bin -d jni org.rohill.privatemobileradio.utilities.AudioProcessor

Заголовочный файл:

/*
 * Class:     org_rohill_privatemobileradio_utilities_AudioProcessor
 * Method:    initALPlayer
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_org_rohill_privatemobileradio_utilities_AudioProcessor_initALPlayer
  (JNIEnv *, jobject);

/*
 * Class:     org_rohill_privatemobileradio_utilities_AudioProcessor
 * Method:    writeAudio
 * Signature: ([B)I
 */
JNIEXPORT jint JNICALL Java_org_rohill_privatemobileradio_utilities_AudioProcessor_writeAudio
  (JNIEnv *, jobject, jbyteArray);

/*
 * Class:     org_rohill_privatemobileradio_utilities_AudioProcessor
 * Method:    closeALPlayer
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_org_rohill_privatemobileradio_utilities_AudioProcessor_closeALPlayer
  (JNIEnv *, jobject);

Я использую этот созданный заголовочный файл в файле C.

Реализация My C:

JNIEXPORT jint JNICALL
Java_org_rohill_privatemobileradio_utilities_AudioProcessor_initALPlayer(JNIEnv * env, jobject object)
{
    return 42;
}

JNIEXPORT jint JNICALL
Java_org_rohill_privatemobileradio_utilities_AudioProcessor_writeAudio(JNIEnv * env, jobject object, jbyteArray byteData)
{
    return 43;
}

JNIEXPORT jint JNICALL
Java_org_rohill_privatemobileradio_utilities_AudioProcessor_closeALPlayer(JNIEnv * env, jobject object)
{
    return 44;
}

Когда я собираю библиотеку рядом, все идет хорошо. Но происходит ошибка, когда я пытаюсь вызвать собственный метод:

if(initALPlayer() == 1){
    Log.i(TAG, "AL Audio Player initialized");
} else {
    Log.e(TAG, "Failed to initialize AL Audio Player");
}

Всякий раз, когда я пытаюсь запустить этот метод, в моих журналах появляется сообщение об ошибке:

04-27 08:03:11.072: ERROR/AndroidRuntime(25017): java.lang.UnsatisfiedLinkError: initALPlayer

Однако я не смог отследить, где это идет не так. Я использовал объявления имен методов из файла заголовка, созданного для меня javah. Я проверил на опечатки, но там, кажется, нет ...

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

Если у кого-то есть идея, как решить эту проблему ... пожалуйста, не стесняйтесь уточнять ...

Ответы [ 2 ]

0 голосов
/ 11 апреля 2014

Java_org_rohill_privatemobileradio_utilities, похоже, ваш проект не назван
OpenAL или аудио.

ndk-build обычно собирает и устанавливает библиотеку с именем
lib [yourProjectName] JNI.so
и упаковывает ее вместе с вашим приложением.
Вы можете проверить это, открыв папку libs,
он содержит подпапку с именем "armeabi" (при сборке для android-arme-abi),
в котором находится сгенерированный файл so.
Таким образом, чтобы вызвать собственный метод, эта библиотека должна быть загружена, и ваши соглашения об именах
из сгенерированного заголовка - файл должен работать нормально.

0 голосов
/ 28 апреля 2011

Очевидно, это была какая-то ошибка соглашения об именах с именем моего C-файла. Когда я изменил это на простой дескриптор из одного слова того, что должен делать файл (без специальных токенов, таких как _ или около того), он работал ...>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...