3

我要疯了。

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

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

在活动中,我像这样加载库:

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 能够工作,但不是。

4

1 回答 1

2

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

于 2012-10-30T07:45:09.897 回答