Android 与NDK的问题

Android 与NDK的问题,android,android-ndk,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(); /** * Write

我一直在尝试通过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()加载正确的库:

在此之后,我使用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为我创建的头文件中的方法名声明。我已经检查了打字错误,但似乎没有任何

真正让我感到奇怪的是,当我使用一个更简单更容易的方法时,它只返回一个字符串,它可以工作


如果有人知道如何解决这个问题。。。请随意解释…

显然,这是我的C文件名的命名约定错误。当我把它改为一个简单的、一个单词的描述文件应该做什么的时候(没有像u之类的特殊标记),它可以工作…>唉…

Java\u org\u rohill\u privatemobileradio\u实用程序这看起来你的项目没有命名
开放或音频

ndk build通常会构建并安装一个名为
lib[yourProjectName]JNI.so的库,并将其与应用程序打包
您可以通过打开文件夹libs来验证这些内容,
它确实包含一个名为“armeabi”的子文件夹(为android arme abi构建时),
生成的so文件驻留在其中
因此,要调用本机方法,必须加载此库,并遵守命名约定

从生成的头文件可以正常工作

面临类似的问题!不明白你做了什么?将NDK中的文件名改为不带特殊字符?我实际上已经写了一个关于这个问题的小文档(2页,MS Word)。看看你是否感兴趣。文件没有解释。这是NDK的介绍。虽然这是真的,但我写这篇文章是因为这个问题。按照这些步骤,我能够得到一个正常工作的本机方法。这个问题是我第一次尝试使用NDK。因为我不知道你的情况是什么,我想这可能会对你有所帮助。我检查了我的方法名、类名和命名空间名,看是否有空格或下划线之类的特殊字符。当和NDK一起使用时,这些不能很好地翻译。因此,我提到的问题是命名惯例。你可能会注意到,他们提出这个问题的人在几年前陈述了他们的问题是什么。此外,函数名中嵌入的java包名与包含它们的JNI库的名称完全无关。是的,但是必须通过System.load加载的库显然与此无关!因为人们在这里寻找与NKD相关的答案,有人可能会发现这些信息很有用。此外,你对命名模式的看法是错误的。我总是在Android.mk文件中给出我的.so文件的特定名称。让我知道是哪个。所以文件做什么。此外,我在最初的回答中自己解决了这个具体问题。这是本机方法的命名约定问题,而不是共享库。
04-27 08:03:11.072: ERROR/AndroidRuntime(25017): java.lang.UnsatisfiedLinkError: initALPlayer