【问题标题】:Superpowered Library linking doesn't work超级库链接不起作用
【发布时间】:2016-04-18 23:39:43
【问题描述】:

我尝试将超级库添加到新的 android studio 项目中,并按照 Android 的示例进行操作,但链接库仍然存在问题。

我有这个错误:

java.lang.UnsatisfiedLinkError: No implementation found for void com.xxx.audiomixprototype.MainActivity.AudioMixPrototype(java.lang.String, long[])(已尝试 Java_com_xxx_audiomixprototype_MainActivity_AudioMixPrototype 和 Java_com_xxx_audiomixprototype_MainActivity_AudioMixPrototype__Ljava_lang_String_2_3J)

我遵循 Superpowered github 自述文件中的简短教程 https://github.com/superpoweredSDK/Low-Latency-Android-Audio-iOS-Audio-Engine

一切都很清楚,但我不明白最后一点:

创建您的自定义 .cpp 和 .h 文件,然后不要忘记在 Android.mk 中正确设置 LOCAL_MODULE 和 LOCAL_SRC_FILES

这可能是我无法正确链接此库的原因。任何解决方案如何正确设置 LOCAL_MODULE 和 LOCAL_SRC_FILES?

【问题讨论】:

  • 那个错误信息看起来不完整;它应该给你它试图匹配的完整方法签名。你能用整行更新帖子吗?

标签: java android c++ audio android-ndk


【解决方案1】:

我在这里做了一些猜测,所以我将概述我对您的项目的假设。

1) 你有一个包含以下行的 Java 文件:

private native void AudioMixPrototype(String apkPath, long[] offsetAndLength);

2) 你在 src/main/jni/filename.cpp 中有这个方法的 JNI 实现

如果您没有在 Android.mk 中正确设置 LOCAL_MODULE 和 LOCAL_SRC_FILES,Java 将无法解析对此方法的 JNI 调用,因此会出现链接错误。您需要将以下内容添加到您的 Android.mk:

include $(CLEAR_VARS)

# name your JNI module
LOCAL_MODULE := audio-mix-prototype 

# assuming your Android.mk is also in src/main/jni, 
# provide the filename to the JNI implementation of your method
LOCAL_SRC_FILES := filename.cpp

# add your flags, other libraries, etc. here

include $(BUILD_SHARED_LIBRARY)

Superpowered SDK 中有一些很好的例子。您可以查看项目的 Android.mk 文件示例,具体取决于 Superpowered here

【讨论】:

  • 好的,我使用与示例“交叉示例”相同的代码创建新项目,但我仍然遇到这个问题。我的 Android.mk 文件是一样的,我只更改了 Superpowered 的路径。
  • 我的 Android.mk 文件是一样的,我只更改了 Superpowered 的路径,在 LOCAL_SRC_FILES 我添加了 SuperpoweredExample.cpp 和 SuperpoweredAndroidAudioIO.cpp 的直接路径
  • 你是如何从 Java 加载你的本地库的?
  • 什么意思?我使用 Cross 示例中的 Java 代码。
  • 您能否阐明您的项目的哪些部分与示例不同?我不清楚您是否正在使用经过一些修改的示例代码,或者您是否已将示例的部分内容复制到不同的项目中。如果您在不同的项目中使用示例中的 Java 代码,则需要在几个地方对其进行修改才能使其正常工作。
【解决方案2】:

好的,我找到了解决方案。当我复制 SuperpoweredExample.cpp 文件时,我没有更改此文件中的 JNIEXPORT。

我有这个:

JNIEXPORT void Java_com_superpowered_crossexample_MainActivity_SuperpoweredExample(JNIEnv *javaEnvironment, jobject self, jstring apkPath, jlongArray offsetAndLength);

改为:

JNIEXPORT void Java_com_xxx_audiomixprototype_MainActivity_SuperpoweredExample(JNIEnv *javaEnvironment, jobject self, jstring apkPath, jlongArray offsetAndLength);

我知道愚蠢的错误,但也许其他人也会遇到同样的问题。

【讨论】:

    猜你喜欢
    • 2013-05-22
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-14
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    相关资源
    最近更新 更多