无法构建系统库中的函数

时间:2012-04-26 21:51:05

标签: 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的东西工作得非常好。我希望sonivox可以工作,如果我只是将它包含为-lsonivox,但不是。

1 个答案:

答案 0 :(得分:2)

我被其他东西带走了,但我最近想出了答案...
libsonivox.so可以动态加载。您需要从Android设备复制.so并将其放在$ NDK-ROOT / platforms / android-14 / arch-arm / usr / lib中,“android-14”可以是任何版本而不是。
这样就可以编译它,当应用程序在设备上运行时,它会使用该设备上的库。