我有以下情况,我正在移植一个使用 OpenSSL 进行 AES 加密的应用程序,我已经编译了所有内容,但是链接器失败了。情况如下: 1. 我写了一个简单的 JNI 包装器:
private native String cipherString(String plainData, int datasize, String password, int passSize);
private native String decipherString(String cipheredData, int datasize, String password, int passSize);
接下来我有一个我调用的 c++ 文件,它具有适当的 JNI sintax,它将 jstring 转换为 char * 和所有其他需要的转换,并调用另一个 cpp 文件,该文件实际上导入 openssl 标头(存在和占)并调用 openssl 方法用于加密和解密。
因此,当我调用 ndk-build 时,它会构建所有拇指,因此编译器会正确编译它们。接下来我需要为 android 移植 openssl,我使用了这个用于 Android 的 OpenSSL, 它就像一个带有简单 ndk-build 的字符(当然在项目的根目录中)并构建 libssl.so 和 libcrypto.so
所以我需要将两者连接起来。我发现连接构建脚本是一个挑战,因此一个 ndk-build 编译并链接所有内容(如果有人有时间,我将不胜感激一个简单的示例项目)
所以我在 jni/includes/prebuilt 中复制了已编译的 libssl 和 libcrypto .so 文件,并希望将它们包含在项目中,以便链接器能够最终创建我将在最后使用的 lib。
我有以下 Android.mk 文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include $(LOCAL_PATH)/includes/build/common.mk
include $(LOCAL_PATH)/includes/build/common_includes.mk
APP_STL := gnustl_static
LOCAL_MODULE := packer
LOCAL_SRC_FILES := modules/cipher/wrapper.cpp \
... #rest of the cpp code
LOCAL_C_INCLUDES += $(LOCAL_PATH)/includes/openssl
LOCAL_SHARED_LIBRARIES := $(LOCAL_PATH)/includes/precompiled/libssl.so \
$(LOCAL_PATH)/includes/precompiled/libcrypto.so
LOCAL_SHARED_MODULES := sslx cryptox
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := sslx
LOCAL_SRC_FILES := $(LOCAL_PATH)/includes/precompiled/libssh.so
include $(PREBUILT_SHARED_LIBRARY)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cryptox
LOCAL_SRC_FILES := $(LOCAL_PATH)/includes/precompiled/libssh.so
include $(PREBUILT_SHARED_LIBRARY)
当调用 ndk-build 时,我感到很失望
sslx: LOCAL_SRC_FILES points to a missing file. Check that /home/user/Development/Tools/sdk/android/ndk/build/core//home/user/Development/Tools/sdk/android/ndk/build/core/includes/precompiled/libssh.so exists or that its path is correct. Aborting . Stop.
正如您已经猜到的那样,路径是完全错误的,让我感到困惑的是 ${LOCAL_PATH} 为第一批包含返回正确的路径,而为 .so 文件返回完全错误的路径......任何帮助将不胜感激!