将第三方库(libs.a)与NDK链接

时间:2010-12-30 15:40:18

标签: java android java-native-interface android-ndk

我正在构建一个Android apk,它使用第三方的一些本机库,这些库位于静态对象代码库(.a文件)中,我需要编写一个JNI包装器来访问Java这些函数。

这些库已经使用交叉编译器进行编译,并且原生于Android。

如何编译链接到.a libs文件中的函数的JNI源?

这是我的Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS := -llog

LOCAL_MODULE    := ndk1
LOCAL_SRC_FILES := native.c

include $(BUILD_SHARED_LIBRARY)

编译时,我只获得编译的native.c文件。

2 个答案:

答案 0 :(得分:11)

要做到这一点。

我必须将这些库声明为模块。如下所示。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := curl
LOCAL_SRC_FILES := libcurl.a
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include

include $(PREBUILT_STATIC_LIBRARY)

libcurl.a文件与此Android.mk文件位于同一文件夹中,而/ include fodler包含标题。

现在在主模块中只声明了lib,Android NDK将负责其余部分。

LOCAL_PATH := $(call my-dir)

include $(call all-subdir-makefiles)
include $(CLEAR_VARS)

LOCAL_LDLIBS := -llog -ldl
LOCAL_MODULE    := rmsdk
LOCAL_SRC_FILES := curlnetprovider.cpp native.c
LOCAL_STATIC_LIBRARIES := curl

include $(BUILD_SHARED_LIBRARY)

注意..在使用之前,您应该包含模块的Android.mk文件。我通过调用all-subdir-makefiles来做到这一点。

答案 1 :(得分:1)

你的libs必须为你的特定目标(Arm)编译,为此我认为你必须使用docs / STANDALONE-TOOLCHAIN.html(在你的ndk-r5文件夹中)中描述的工具链。