在Android NDK下链接共享库

时间:2012-06-03 22:16:31

标签: 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
(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 / other * .h文件
  • JNI / Android.mk
  • JNI / Applicatoin.mk

library 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 ++下编译没有问题,有什么想法吗?

3 个答案:

答案 0 :(得分:5)

您的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文件,您可以成功构建代码而不会出现任何错误。

答案 1 :(得分:2)

您需要告诉有关共享库的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来构建“第二个项目”。尝试使用ndk-build运行V=99(尝试V=99 ndk-buildndk-build V=99 - 我的内存失败)。这将显示确切的失败链接命令。您可能应该选择-lXtract-L/path/to/libXtract/library。 (在实际修复构建设置之前,有时可以方便地复制并粘贴链接命令以手动运行它以找到成功链接的正确选项。)

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

答案 2 :(得分:2)

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

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

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

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

否则会出现如下错误

  

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