androidndk下的链接共享库

androidndk下的链接共享库,android,android-ndk,Android,Android Ndk,我成功地将库LibXtract编译为共享对象LibXtract.so,并希望在第二个项目中使用它 在提到的项目中,我尝试在简单函数上编译它: #include <com_androidnative1_NativeClass.h> #include <android/log.h> #include "libxtract.h" JNIEXPORT void JNICALL Java_com_androidnative1_NativeClass_showText (JNIEn

我成功地将库LibXtract编译为共享对象LibXtract.so,并希望在第二个项目中使用它

在提到的项目中,我尝试在简单函数上编译它:

#include <com_androidnative1_NativeClass.h>
#include <android/log.h>
#include "libxtract.h"

JNIEXPORT void JNICALL Java_com_androidnative1_NativeClass_showText
(JNIEnv *env, jclass clazz)
{

    float mean = 0, vector[] = {.1, .2, .3, .4, -.5, -.4, -.3, -.2, -.1}, spectrum[10];
    int n, N = 9;
    float argf[4];

    argf[0] = 8000.f;
    argf[1] = XTRACT_MAGNITUDE_SPECTRUM;
    argf[2] = 0.f;
    argf[3] = 0.f;

    xtract[XTRACT_MEAN]((void *)&vector, N, 0, (void *)&mean);
    __android_log_print(ANDROID_LOG_DEBUG, "LIbXtract", "Button pushe2");
}
我还是有错误:

Compile thumb  : com_androidnative1_NativeClass <= com_androidnative1_NativeClass.c
SharedLibrary  : libcom_androidnative1_NativeClass.so./obj/local/armeabi/objs/com_androidnative1_NativeClass/com_androidnative1_Nativ    eClass.o: In function `Java_com_androidnative1_NativeClass_showText':
/home/jack/Projects/AndroidNative1/jni/com_androidnative1_NativeClass.c:20: undefined reference to `xtract'
collect2: ld returned 1 exit status
make: *** [obj/local/armeabi/libcom_androidnative1_NativeClass.so] Error 1

compilethumb:com\u androidnative1\u NativeClass您需要告诉Android NDK构建脚本关于您的共享库。检查
${NDK}/doc/PREBUILTS.html
以了解如何执行此操作。他们建议在您的
libXtract.so
所在的目录中添加
Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libXtract
LOCAL_SRC_FILES := libXtract.so
include $(PREBUILT_SHARED_LIBRARY)
调试提示:我猜您正在使用
ndk build
构建“第二个项目”。尝试使用
V=99
运行
ndk build
(尝试
V=99 ndk build
ndk build V=99
-我的内存失败)。这将向您显示确切的失败链接命令。您应该有选项
-lXtract
-L/path/to/libXtract/library
。(有时,在实际修复生成设置之前,只需复制并粘贴链接命令即可手动运行该命令,以找到成功链接的正确选项。)


更新:我现在看到@codetiger的评论似乎指向了相同类型的答案(没有提到NDK文档,该文档阅读效果很好-因此我不会删除此答案)。

您的Android make文件应该是

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LIB_PATH := $(LOCAL_PATH)/../lib
LOCAL_SRC_FILES := com_androidnative1_NativeClass.c 
LOCAL_MODULE := com_androidnative1_NativeClass
LOCAL_LDLIBS += -llog
本地\u LDLIBS+=$(库路径)-lxtract


在您的第二个项目中尝试这个make文件,您可以成功地构建代码,而不会出现任何错误。

在上面的答案中,所有都是正确的,但除了一个

当我们想要链接lib时,我们必须在
LOCAL\u LDLIBS
dir之前添加-L
,如下所示

LIB_PATH := $(LOCAL_PATH)/../lib

LOCAL_LDLIBS += **-L**$(LIB_PATH) -lxtract
否则将给出如下错误

无法打开XXX/./lib:权限被拒绝


你到底是如何编译libxtract.so的?你为什么不把它的编译添加到同一个Android.mk文件中,这样两个共享库就可以同时构建呢?我采用这个解决方案来编译它,我只是想添加一个分解库来保持它的简单性。这个答案听起来像是解决了你的问题。可能重复我使用你的和@FooF解决方案,我的Android.mk看起来像:LOCAL_PATH:=$(调用我的dir)include$(CLEAR_VARS)LOCAL_MODULE:=libxtract LOCAL_SRC_FILES:=libxtract.so include$(预构建的共享_库)include$(CLEAR_VARS)LIB_PATH:=$(LOCAL_PATH)/../lib/libxtract.so LOCAL_SRC_FILES:=com_androidnative1_NativeClass.c LOCAL_MODULE:=com_androidnative1_NativeClass LOCAL_LDLIBS+=-llog LOCAL_LDLIBS+=$(lib_PATH)LOCAL_SHARE_库:=libxtract include$(BUILD_SHARED_库)及其成功构建,但是当我在使用它的地方运行代码时,我得到了错误:06-04 21:58:26.504:E/AndroidRuntime(14792):由以下原因引起:java.lang.unsatifiedLinkError:无法加载libxtract:findLibrary返回null当然我使用System.loadLibrary(“libxtract”);看,在成功构建libxtract.so之后,在第二个项目中使用这个make文件。并且LIB_路径应该是正确的。在第二个project make文件中应使用“LOCAL_LDLIBS+=$(LIB_PATH)-lxtract”,否则您将得到上面发出的错误。LOCAL_SHARE_LIBRARIES=>LOCAL_SHARED_librarie您可以澄清您引用的答案吗?在搜索路径中包含共享库的语法。1) 必须通过-L指令指定路径,然后紧接着2)通过-L指令指定要共享的库。
LOCAL_SHARE_LIBRARIES := libxtract
include $(BUILD_SHARED_LIBRARY)
LIB_PATH := $(LOCAL_PATH)/../lib

LOCAL_LDLIBS += **-L**$(LIB_PATH) -lxtract