【问题标题】:Link shared library under Android NDKAndroid NDK下的链接共享库
【发布时间】:2012-06-03 22:16:31
【问题描述】:

我成功地将库 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");
}

我有扁平结构:

  • jni/com_androidnative1_NativeClass.c
  • jni/com_androidnative1_NativeClass.hjni/libxtract.h
  • 来自 libxtract 接口的 jni/其他 *.h 文件
  • jni/Android.mk
  • jni/Applicatoin.mk

库 libxtract.so 我放在 mainproject/lib 文件夹中

我的 Android.mk 文件如下所示:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := com_androidnative1_NativeClass.c 
LOCAL_MODULE := com_androidnative1_NativeClass
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/
LOCAL_LDLIBS += -llog
LOCAL_SHARE_LIBRARIES := libxtract
NDK_MODULE_PATH += $(LOCAL_PATH)/../lib/
include $(BUILD_SHARED_LIBRARY)

我仍然收到错误:

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

代码来自 LibXtract 的示例,在 C++ 下编译没有问题,有什么想法吗?

【问题讨论】:

标签: android android-ndk


【解决方案1】:

你的 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

LOCAL_LDLIBS += $(LIB_PATH) -lxtract

LOCAL_SHARE_LIBRARIES := libxtract
include $(BUILD_SHARED_LIBRARY)

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

【讨论】:

  • 我使用你的和@FooF 解决方案,我的 Android.mk 看起来像: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libxtract LOCAL_SRC_FILES := libxtract.so include $ (PREBUILT_SHARED_LIBRARY) 包括 $(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包括 $(BUILD_SHARED_LIBRARY)
  • 及其构建成功,但是当我在使用它的地方运行代码时出现错误:06-04 21:58:26.504: E/AndroidRuntime(14792): Caused by: java.lang. UnsatisfiedLinkError: Couldn't load libxtract: findLibrary returned null 当然我使用 System.loadLibrary("libxtract");
  • 看,在成功构建 libxtract.so 后,在你的第二个项目中使用这个 make 文件。 LIB_PATH 应该是正确的。并且 'LOCAL_LDLIBS += $(LIB_PATH) -lxtract' 应该在你的第二个项目 make 文件中使用,否则你会得到你在上面发出的错误。
  • LOCAL_SHARE_LIBRARIES => LOCAL_SHARED_LIBRARIES
【解决方案2】:

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

当我们要链接 lib 时,我们必须在 LOCAL_LDLIBS dir 之前 add -L 如下所示。

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

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

否则会报如下错误

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

【讨论】:

  • 你能澄清一下你引用的是哪个答案吗?
  • 在搜索路径中包含共享库的语法。 1) 必须通过 -L 指令指定路径,然后 2) 紧接着通过 -l 指令共享要共享的库。
【解决方案3】:

您需要告诉 Android NDK 构建脚本您的共享库。检查${NDK}/doc/PREBUILTS.html 以获取如何完成此操作的说明。他们建议将Android.mk 添加到您拥有libXtract.so 的同一目录中:

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-buildndk-build V=99 - 我的记忆力下降)。这将向您显示确切的失败链接命令。您应该可以选择-lXtract-L/path/to/libXtract/library。 (有时,在实际修复构建设置之前,只需复制并粘贴链接命令以手动运行它以找到成功链接的正确选项,这很方便。)

更新:我现在看到@codetiger 的评论似乎指向了相同的答案(没有提到很好读的 NDK 文档 - 所以我不会删除这个答案)。

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    相关资源
    最近更新 更多