我要疯了。
基本上,我正在尝试使用 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 能够工作,但不是。