I’m trying to compile my Cocos2d-x project with OpenSSL to Android. I can run the project properly on Visual Studio Community 2013, but can’t compile it on the command line with cocos compile -p android --android-studio
.
I installed OpenSSL to path project\cocos2d\external\OpenSSL-Win32 and added the OpenSSL include path to the Android.mk file:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../../proj.win32 \
$(LOCAL_PATH)/../../../cocos2d/external/OpenSSL-Win32/include
I followed Undefined reference to libssl function with Android NDK, but it didn't really help. I don't have shared libraries in my OpenSSL folder, only static ones. The best I can come up with for now is this definition:
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)
This gave me the following error:
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
The file libcrypto-1_1.a is in that folder.
Edit
I downloaded prebuilt OpenSSL libraries (shared libs included) for Android from here: https://github.com/r4sas/OpenSSL-1.1-Android-Prebuilt.
This package contains an Android.mk file that has definitions for shared libraries:
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)
I added these definitions to the Android.mk file in folder cocos2dx-project\proj.android-studio\app\jni.
It also contains libcrypto.so and libssl.so files. I copied these files to cocos2dx-project\proj.android-studio\app\jni and tried to compile the project, but got the following errors:
Android NDK: Trying to define local module 'openssl' in jni/Android.mk.
Android NDK: But this module was already defined by jni/Android.mk.
Edit 2
I think I have made some progress.
My Android.mk looks like this now:
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,.)
Those shared libraries are now build properly, but I get the undefined reference error:
[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'