我一直试图通过NDK获得Android 2.2的OpenAL端口,但是我遇到了一个我自己似乎无法解决的错误。我在我的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文件中使用这个创建的头文件。
我的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中的方法名声明。我检查过拼写错误,但似乎没有...
真正令我难以置信的是,当我使用一种更简单,更简单的方法,只返回一个字符串时,它就可以...
如果有人知道如何解决这个问题,请随时详细说明......
答案 0 :(得分:0)
显然,我的C文件名称出现了一些命名约定错误。当我把它改成一个简单的,一个单词的描述文件应该做什么(没有特殊的令牌,如_左右),它的工作原理......>。<叹息...
答案 1 :(得分:-1)
Java_org_rohill_privatemobileradio_utilities看起来您的项目未命名为
OpenAL或音频。
ndk-build通常会构建和安装一个名为
lib [yourProjectName] JNI.so的库,并将其与您的应用程序打包在一起。
你可以通过打开文件夹libs来验证这些事情
它确实包含一个名为“armeabi”的子文件夹(当为android-arme-abi构建时),
生成的so文件所在的位置。
因此,要调用本机方法,必须加载此库,以及您的命名约定
从生成的头文件 - 文件应该工作正常。