Android Can';t根据系统库中的函数进行构建
我快疯了 基本上,我正在尝试使用NDK访问android平台上位于system/lib/中的共享库中的一些函数 我试图利用的图书馆是libsonivox.so。我的主要目标是从本土活动中使用它。我理解这会使事情变得复杂,因为我需要在加载依赖于它的我自己的库之前加载这个库(静态)。因此,我正试图通过定期的活动和JNI让它工作 在“活动”中,我按如下方式加载库:Android Can';t根据系统库中的函数进行构建,android,android-ndk,java-native-interface,shared-libraries,Android,Android Ndk,Java Native Interface,Shared Libraries,我快疯了 基本上,我正在尝试使用NDK访问android平台上位于system/lib/中的共享库中的一些函数 我试图利用的图书馆是libsonivox.so。我的主要目标是从本土活动中使用它。我理解这会使事情变得复杂,因为我需要在加载依赖于它的我自己的库之前加载这个库(静态)。因此,我正试图通过定期的活动和JNI让它工作 在“活动”中,我按如下方式加载库: static { System.loadLibrary("sonivox"); System.loadLibrary("nativ
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
这样库就被加载了
然后我将此函数添加到本机音频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构建的输出:
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
这一定是有什么不对的地方。我认为sonivox库在编译所有内容时都需要存在。但是,无论我对此文件做了什么更改,库都不会加载,这主要涉及尝试将其作为预构建的共享库或预构建的静态库。此外,OpenSL的东西工作得非常好。如果我只是把sonivox作为-lsonivox包含进来,我希望它能起作用,但是没有。我被其他东西迷住了,但我最近找到了这个问题的答案……
libsonivox.so可以动态加载。您需要从android设备复制.so,并将其放入$NDK-ROOT/platforms/android-14/arch arm/usr/lib中,“android-14”可以是任何版本。
这样就可以对其进行编译,当应用程序在设备上运行时,它会使用该设备上的库。对不起,我的问题太冗长了!我只是想告诉你所有的细节。我很想弄明白。显示你的Android.mk makefile。这是一个生成错误,不是运行时错误。你需要让-lsonivox工作,或者想出一些具有相同效果的东西。顺便问一下,这是一个您应该使用的稳定API吗?如果不是,请意识到你正处于一个棘手的领域。我刚刚在我的原始帖子中添加了Android.mk。我在libsonivox.so上搜索了一下,似乎没有找到任何非公开的。如前所述。根据NDK构建您自己的副本并查找未定义的引用错误将是第一次尝试检查。必须说,我对这个库不太熟悉,确切地说,它是做什么的,谁写的,授权等等。如果你想在短期内冒险,你可能会从系统构建中获得一个.a文件,以满足构建链接器的要求,或者使用“允许未定义”标志,但在应用程序中包括你自己的库(如果可能/允许)似乎能让你对变化有最大的免疫力。是的,并将
-lsonyvox
添加到LOCAL\u LDLIBS
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)