我一直在网上寻找关于如何做到这一点的教程/信息,但到目前为止,我还没有找到我能理解的任何东西。对我来说,这一切都非常混乱。
基本上,我试图弄清楚如何使用NDK将C文件库编译成本机库,并在我的Android应用程序中使用编译后的库。
据我所知,我需要一个Android自定义cmake文件,但我不知道从哪里开始,而且我找到的文档非常难以理解。
因此,我需要一些帮助理解编译库的过程:
1. 使用Gradle和CMakeLists.txt编译库,将其链接到openssl和libcrypto,并将最终库与我的Android Studio项目链接。 2. 能够从我的Java代码中调用这些库中的本机函数。(我知道这需要JNI Java包装器)
(我已经成功构建了所有android需要的archs的libssl和libcrypto,但我不确定该怎么处理.a/.so文件。)
非常感谢您对此事的任何帮助。
谢谢
编辑:
我设法生成了一些库文件,如下所示。
文件结构:
.idea
app
build
gradle
jni <--- I made this folder specifically fo this.
Android.mk <-- This is the important file.
include
openssl
<openssl header files>
libs
arm64-v8a
libcrypto.a
libcrypto.so
libssl.a
libssl.so
armeabi
libcrypto.a
libcrypto.so
libssl.a
libssl.so
armeabi--v7a
libcrypto.a
libcrypto.so
libssl.a
libssl.so
mips
libcrypto.a
libcrypto.so
libssl.a
libssl.so
mips64
libcrypto.a
libcrypto.so
libssl.a
libssl.so
x86
libcrypto.a
libcrypto.so
libssl.a
libssl.so
x86_64
libcrypto.a
libcrypto.so
libssl.a
libssl.so
src <--- These are example files that i used to build this with.
myc_files.c
myother_c_files.c
myc_heades.h
myother_c_headers.h
我随后在 Android.mk 文件中使用以下内容通过运行 ndk-build
生成一些库。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Select from arm64-v8a armeabi armeabi-v7a mips mips64 x86 x86_64
ARCH := armeabi
APP_UNIFIED_HEADERS := true
#APP_ABI := $(ARCH)
# TARGET_ARCH := $(ARCH)
TARGET_PLATFORM := android-14
SRC_DIR := $(LOCAL_PATH)/src
HDR_DIR := $(LOCAL_PATH)/include
LIB_DIR := $(LOCAL_PATH)/libs
LOCAL_C_INCLUDES := $(HDR_DIR)
LOCAL_MODULE := myclib
LOCAL_SRC_FILES := $(SRC_DIR)/myc_files.c $(SRC_DIR)/myother_c_files.c
LOCAL_LDLIBS += -L$(LIB_DIR)/$(ARCH) -lssl -lcrypto
include $(BUILD_STATIC_LIBRARY)
图书馆被放置在
PROJECT/obj/local
中,我不知道下一步该怎么做,也不确定那个Android.mk文件是否正确地构建了库。
libcrypto.so
和libssl.so
感到非常失望。Android 的init
进程 Zygote 会预加载一个旧版本的 OpenSSL 库,该库已经捆绑在操作系统中。您打包的更新版本将永远不会被加载。您应该使用 OpenSSL 维基上讨论的 Wrapper Shared Object 技术。 - jww