android - 无法针对系统库中的函数构建

标签 android android-ndk java-native-interface shared-libraries

我要疯了。

基本上,我正在尝试使用 NDK 访问 android 平台上位于 system/lib/的共享库中的一些函数。

我尝试使用的库是 libsonivox.so。我的主要目标是从 NativeActivity 使用它。我知道这会使事情复杂化,因为我需要在加载依赖于它的自己的库之前(静态地)加载该库。因此,我试图让它通过常规 Activity 和 JNI 工作。

在 Activity 中,我像这样加载库:

static {
  System.loadLibrary("sonivox");
  System.loadLibrary("native-audio-jni");
}

“native-audio-jni”库来自 NDK 样本,但我正在修改它以尝试访问 sonivox 函数。

如果没有从 libnative-audio-jni 调用 libsonivox,一切都可以正常编译。 LogCat 输出中的这一行给了我希望:

  04-26 15:01:14.973: D/dalvikvm(691): No JNI_OnLoad found in /system/lib/libsonivox.so   
  0x412a1100, skipping init

所以库被加载了。

然后我将这个函数添加到 native-audio-jni.c:

void Java_jay_enn_eye_JNImidiActivity_createMidi(JNIEnv* env,
        jclass clazz)
{
  pLibConfig = EAS_Config();
}

pLibConfig 声明如下:

static const S_EAS_LIB_CONFIG* pLibConfig = NULL;

声明时,如果不添加上述函数,它可以正常编译。所以至少头文件......在那里。

当我将该函数放入代码中时,这是 ndk-build 的输出:

  Compile thumb  : native-audio-jni <= native-audio-jni.c
  SharedLibrary  : libnative-audio-jni.so
  ./obj/local/armeabi/objs/native-audio-jni/native-audio-jni.o: In function
  `Java_jay_enn_eye_JNImidiActivity_createMidi':
  /home/anthony/Documents/eclipse/JNImidi/jni/native-audio-jni.c:202: undefined   
  reference
  to `EAS_Config'
  collect2: ld returned 1 exit status
  make: *** [obj/local/armeabi/libnative-audio-jni.so] Error 1

我不确定 libnative-audio-jni 是否无法访问 libsonivox,或者我是否需要 dlsym() 或 sym() 链接 sonivox 函数以使用它们。我无法尝试其中任何一个,因为该库是在 system/lib/中找到的,而不是我提供的,所以我没有完整的路径来提供这样做。

我正在考虑的另一个选择是获取 libsonivox.so,将其复制到项目中的一个目录中,然后更改 Android.mk,以便它包含该 lib 作为预构建的共享库。我在想也许该库需要在编译时包含在内。

编辑:这是 Android.mk 文件:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := native-audio-jni
LOCAL_SRC_FILES := native-audio-jni.c
# for native audio
LOCAL_LDLIBS    += -lOpenSLES
# for logging
LOCAL_LDLIBS    += -llog
# for native asset manager
LOCAL_LDLIBS    += -landroid

include $(BUILD_SHARED_LIBRARY)

这一定是哪里不对劲。我认为在编译所有内容时,sonivox 库 需要存在。但是,无论我对此文件进行何种更改,库都不会加载,这主要涉及尝试将其作为 PREBUILT_SHARED_LIBRARY 或 PREBUILT_STATIC_LIBRARY 包含在内。此外,OpenSL 的东西工作得很好。如果我将它作为 -lsonivox 包括在内,我希望 sonivox 能够工作,但是不行。

最佳答案

我被其他事情冲昏了头脑,但我最近找到了答案......
libsonivox.so 可以动态加载。您需要从您的 Android 设备复制 .so 并将其放置在 $NDK-ROOT/platforms/android-14/arch-arm/usr/lib 中,“android-14”可以是任何版本。
这样就可以对其进行编译,并且当应用程序在设备上运行时,它会使用该设备上的库。

关于android - 无法针对系统库中的函数构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10341938/

相关文章:

java - Java int[ ] 数组在 JVM 中是如何实现的?

java - 检测并删除 ArrayList 中的重复项?

java - 使用 google firebase auth 用户个人资料图像 url 为空

安卓触摸屏尺寸

java - Android Studio 中带有实验性 Gradle 插件的 native 预构建共享库

java - 如何使用 Eclipse TPTP 分析 JNI 应用程序?

java - 编译 JNI 的问题

android - 9-patch 边界问题

android - 将 aar 包含在 aar 中

android - getaddrinfo() 在 Android 中失败?