Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Can';t根据系统库中的函数进行构建_Android_Android Ndk_Java Native Interface_Shared Libraries - Fatal编程技术网

Android Can';t根据系统库中的函数进行构建

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

我快疯了

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

我试图利用的图书馆是libsonivox.so。我的主要目标是从本土活动中使用它。我理解这会使事情变得复杂,因为我需要在加载依赖于它的我自己的库之前加载这个库(静态)。因此,我正试图通过定期的活动和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
这样库就被加载了

然后我将此函数添加到本机音频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)