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

Mar*_*los 8 java java-native-interface android 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)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*los 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)
Run Code Online (Sandbox Code Playgroud)

使用与此Android.mk文件位于同一文件夹中的libcurl.a文件,以及带有标头的/ 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)
Run Code Online (Sandbox Code Playgroud)

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

  • 也适用于共享库(*.so).例如,我只是将"adb pull /system/lib/libsqlite.so"链接到sqlite. (2认同)