androidndk下的链接共享库
我成功地将库LibXtract编译为共享对象LibXtract.so,并希望在第二个项目中使用它 在提到的项目中,我尝试在简单函数上编译它: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
#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