【发布时间】:2018-01-21 12:30:13
【问题描述】:
我正在尝试使用 OpenSSL 将我的 Cocos2d-x 项目编译到 Android。我可以在 Visual Studio Community 2013 上正常运行项目,但无法在命令行中使用 cocos compile -p android --android-studio 编译它。
我将 OpenSSL 安装到路径 project\cocos2d\external\OpenSSL-Win32 并将 OpenSSL 包含路径添加到 Android.mk 文件:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../proj.win32 \
$(LOCAL_PATH)/../../../cocos2d/external/OpenSSL-Win32/include
我关注了Undefined reference to libssl function with Android NDK,但它并没有真正帮助。我的 OpenSSL 文件夹中没有共享库,只有静态库。我现在能想到的最好的定义是:
include $(CLEAR_VARS)
LOCAL_MODULE := crypto
LOCAL_SRC_FILES := $(LOCAL_PATH)/../../../cocos2d/external/OpenSSL-Win32/lib/MinGW/libcrypto-1_1.a
include $(PREBUILT_STATIC_LIBRARY)
这给了我以下错误:
Android NDK: ERROR:jni/Android.mk:crypto: LOCAL_SRC_FILES points to a missing file
Android NDK: Check that jni/jni/../../../cocos2d/external/OpenSSL-Win32/lib/MinGW/libcrypto-1_1.a exists or that its path is correct
文件 libcrypto-1_1.a 位于该文件夹中。
编辑
我从这里下载了适用于 Android 的预构建 OpenSSL 库(包括共享库):https://github.com/r4sas/OpenSSL-1.1-Android-Prebuilt。
此包包含一个 Android.mk 文件,其中包含共享库的定义:
include $(CLEAR_VARS)
LOCAL_MODULE := opencrypto
LOCAL_SRC_FILES := libcrypto.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := openssl
LOCAL_SRC_FILES := libssl.so
include $(PREBUILT_SHARED_LIBRARY)
我将这些定义添加到文件夹 cocos2dx-project\proj.android-studio\app\jni 中的 Android.mk 文件中。
它还包含 libcrypto.so 和 libssl.so 文件。我将这些文件复制到 cocos2dx-project\proj.android-studio\app\jni 并尝试编译项目,但得到以下错误:
Android NDK: Trying to define local module 'openssl' in jni/Android.mk.
Android NDK: But this module was already defined by jni/Android.mk.
编辑 2
我想我已经取得了一些进展。
我的 Android.mk 现在看起来像这样:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := crypto
LOCAL_SRC_FILES := libcrypto.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := openssl
LOCAL_SRC_FILES := libssl.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
$(call import-add-path,$(LOCAL_PATH)/../../../cocos2d)
$(call import-add-path,$(LOCAL_PATH)/../../../cocos2d/external)
$(call import-add-path,$(LOCAL_PATH)/../../../cocos2d/cocos)
$(call import-add-path,$(LOCAL_PATH)/../../../cocos2d/cocos/audio/include)
LOCAL_MODULE := MyLib_shared
LOCAL_MODULE_FILENAME := libMyLib
LOCAL_SRC_FILES := hellocpp/main.cpp \
...
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../proj.win32 \
$(LOCAL_PATH)/../../../cocos2d/external/openssl/include
# _COCOS_HEADER_ANDROID_BEGIN
# _COCOS_HEADER_ANDROID_END
LOCAL_STATIC_LIBRARIES := cocos2dx_static
# _COCOS_LIB_ANDROID_BEGIN
# _COCOS_LIB_ANDROID_END
# _COCOS_LIB_IMPORT_ANDROID_BEGIN
# _COCOS_LIB_IMPORT_ANDROID_END
include $(BUILD_SHARED_LIBRARY)
$(call import-module,.)
这些共享库现在已正确构建,但我收到 未定义引用 错误:
[armeabi] Install : libcrypto.so => libs/armeabi/libcrypto.so
[armeabi] Install : libssl.so => libs/armeabi/libssl.so
[armeabi] SharedLibrary : libMyLib.so
jni/../../../proj.win32/EncryptionHelper.cpp:61: error: undefined reference to 'EVP_CIPHER_CTX_new'
【问题讨论】:
-
在引用的dup中特别注意
LOCAL_LDLIBS。 -
@jww 查看编辑部分。
-
如果您使用的是共享对象,那么您将使用
include $(PREBUILT_SHARED_LIBRARY)和LOCAL_SHARED_LIBRARIES := ssl crypto。我不确定静态存档而不是共享对象需要什么。LOCAL_SRC_FILES似乎错了,但谷歌真的搞砸了那个构建系统。它的记录很差,使用起来绝对一团糟。 -
@jww 使用静态存档有什么问题?
-
静态存档没有任何问题。当您因为 Android 和 Zygote 需要包装共享对象时,您必须使用静态存档。另请参阅 OpenSSL wiki 上的 Android。但是,如果您使用 C++,那么您的选择会变得更小。 不使用共享对象时必须非常小心。 Android NDK 曾经有一个涵盖该主题的 C++ 自述文件。
标签: windows android-ndk openssl cocos2d-x linker-errors