【问题标题】:How to use shared library without header files in Android?如何在Android中使用没有头文件的共享库?
【发布时间】:2017-11-09 11:05:53
【问题描述】:

我有一个共享库(例如 libcrypto.so),但没有头文件。

我可以在其他模块中使用这个库吗?

我尝试使用 LOCAL_EXPORT_C_INCLUDES 导出头文件,但它不起作用。

这是预建模块:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libcrypto
LOCAL_SRC_FILES := prebuilt/$(TARGET_ARCH_ABI)/libcrypto.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)

而且,这是使用 libcrypto 的模块:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES += test.c # include "openssl/crypto.h"
LOCAL_C_INCLUDES += $(crypto_PATH)/include
LOCAL_SHARED_LIBRARIES += libcrypto

LOCAL_MODULE := libtest
LOCAL_MODULE_TAGS := optional
LOCAL_ARM_MODE := arm
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)

这是 libcrypto 模块(boringssl):

LOCAL_PATH := $(call my-dir)
# Target shared library
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libcrypto
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/src/include
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk $(LOCAL_PATH)/crypto-sources.mk
LOCAL_SDK_VERSION := 9
LOCAL_CFLAGS += -fvisibility=hidden -DBORINGSSL_SHARED_LIBRARY -DBORINGSSL_IMPLEMENTATION -DOPENSSL_SMALL -Wno-unused-parameter
# sha256-armv4.S does not compile with clang.
LOCAL_CLANG_ASFLAGS_arm += -no-integrated-as
LOCAL_CLANG_ASFLAGS_arm64 += -march=armv8-a+crypto
include $(LOCAL_PATH)/crypto-sources.mk
include $(BUILD_SHARED_LIBRARY)

编辑:添加了boringssl 模块。我实际上在 test.c 中使用了#include "openssl/crypto.h"

【问题讨论】:

  • 您可以运行ndk-build V=1 来详细运行,这将打印 ndk-build 运行的所有构建命令。如果您根本看不到包含路径。一个可能的答案是路径是错误的。如何包含您的两个 Android.mk 文件?你在用import-module吗?
  • 如果$(crypto_PATH)/include中存在头文件,则一切正常。但是,如果我删除标头源,将找不到 crypto.h。标头源没有自动导出?
  • 有人可以帮忙吗?我在 Ubuntu 中使用 NDK 12 和 Eclipse 构建了它。导入header就可以了。

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


【解决方案1】:

通常,您会在 include/openssl 下找到 crypto.h。因此,在您的情况下,要么更改 test.c

中的 #include 语句
#include "openssl/crypto.h"

或者(不太推荐),编辑

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include/openssl

【讨论】:

  • 也许答案就像LOCAL_EXPORT_C_INCLUDE_DIRSLOCAL_EXPORT_C_INCLUDES 一样微不足道?
  • 首先,我想知道我们是否可以使用libcrypto.so绕过将头文件添加到项目中?是否可以?我认为LOCAL_EXPORT_C_INCLUDES 是为了其他目的。
  • 其实我可以用dlsym来调用函数,但这不是什么好办法。如果可能,我想使用导出的标题。
  • 什么是“绕过”?导出的标头干净且合法。
猜你喜欢
  • 2020-03-31
  • 2012-09-16
  • 2014-11-10
  • 2016-04-25
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
相关资源
最近更新 更多