NDK问题

时间:2011-04-27 08:16:53

标签: android android-ndk

我一直试图通过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中的方法名声明。我检查过拼写错误,但似乎没有...

真正令我难以置信的是,当我使用一种更简单,更简单的方法,只返回一个字符串时,它就可以...

如果有人知道如何解决这个问题,请随时详细说明......

2 个答案:

答案 0 :(得分:0)

显然,我的C文件名称出现了一些命名约定错误。当我把它改成一个简单的,一个单词的描述文件应该做什么(没有特殊的令牌,如_左右),它的工作原理......>。<叹息...

答案 1 :(得分:-1)

Java_org_rohill_privatemobileradio_utilities看起来您的项目未命名为
OpenAL或音频。
 
ndk-build通常会构建和安装一个名为
lib [yourProjectName] JNI.so的库,并将其与您的应用程序打包在一起。
你可以通过打开文件夹libs来验证这些事情 它确实包含一个名为“armeabi”的子文件夹(当为android-arme-abi构建时),
生成的so文件所在的位置。
因此,要调用本机方法,必须加载此库,以及您的命名约定
从生成的头文件 - 文件应该工作正常。