如何在ndk中从不同的源文件为不同的ABI构建具有相同MODULE名称的库?

时间:2016-09-01 02:23:46

标签: android-ndk ndk-build android.mk

在ndk中,我想为来自不同源文件的不同ABI构建具有相同MODULE名称的库。

我在dir下有两个来源:armeabi-v7a和arm64-v8a

这是我的Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := session
LOCAL_SRC_FILES := armeabi-v7a/libsession.so
TARGET_ARCH_ABI := armeabi-v7a
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := session
LOCAL_SRC_FILES := arm64-v8a/libsession.so
TARGET_ARCH_ABI := arm64-v8a
include $(PREBUILT_SHARED_LIBRARY)

这是我的Application.mk:

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a arm64-v8a
APP_PLATFORM := android-21

但是错误:
Android NDK:尝试在jni / Android.mk中定义本地模块'session' Android NDK:但是这个模块已经由jni / Android.mk定义。

如何实现?

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用.so文件似乎位于以ABI命名的子目录中这一事实:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := session
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libsession.so
include $(PREBUILT_SHARED_LIBRARY)

如果不是这种情况,您可以检查TARGET_ARCH_ABI的值,并采取相应的行动。例如:

ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_SRC_FILES := foo/libfoo.so
else ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
LOCAL_SRC_FILES := bar/libbar.so
endif

没有必要自己设置TARGET_ARCH_ABI - 它是由构建系统为您设置的。