Я пытался заставить порт 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. Я проверил на опечатки, но там, кажется, нет ...
Что меня действительно поражает, так это то, что когда я использую более простой и легкий метод, который возвращает только строку, он работает ...
Если у кого-то есть идея, как решить эту проблему ... пожалуйста, не стесняйтесь уточнять ...