简体   繁体   English

如何使用NDK 19在OSX Darwin上交叉编译适用于64位Android的OpenSSL

[英]How to cross compile OpenSSL for 64 bit Android on OSX Darwin using NDK 19

I previously asked essentially the same question (different NDK) here and thought I correctly built openssl but once I got around to trying to link it to my app I discovered I didn't build it correctly. 我以前在这里问过基本上相同的问题(不同的NDK) 并认为我正确构建了openssl,但是一旦尝试将其链接到我的应用程序后,我发现我没有正确构建它。

  1. If I bridge of the answer from @AlexCohn here I start with the setenv_android.sh script. 如果我在这里桥接@AlexCohn的答案,那么我将从setenv_android.sh脚本开始。

  2. I modify the script to set THE_ARCH=arm64-v8a trying to target 64bit android architecture. 我修改脚本以将THE_ARCH=arm64-v8a设置THE_ARCH=arm64-v8a尝试以64位android体系结构为目标。

  3. When I run the script there some things it fails to find: 当我运行脚本时,找不到某些东西:

     ERROR: Failed to find Android cpp. Please edit this script. ERROR: Failed to find Android gcc. Please edit this script. ERROR: Failed to find Android g++. Please edit this script. ERROR: AOSP_STL_INC is not valid. Please edit this script. ERROR: AOSP_STL_LIB is not valid. Please edit this script. ANDROID_NDK_ROOT: /Users/spartygw/android-ndk-r19/ AOSP_TOOLCHAIN_PATH: /Users/spartygw/android-ndk-r19//toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin AOSP_ABI: arm64-v8a AOSP_API: android-21 AOSP_SYSROOT: /Users/spartygw/android-ndk-r19//platforms/android-21/arch-arm64 AOSP_FLAGS: -funwind-tables -fexceptions -frtti AOSP_STL_INC: /Users/spartygw/android-ndk-r19//sources/cxx-stl/stlport/stlport/ AOSP_STL_LIB: /Users/spartygw/android-ndk-r19//sources/cxx-stl/stlport/libs/arm64-v8a/libstlport_shared.so 
  4. When I look in /Users/spartygw/android-ndk-r19//toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin there is no aarch64-linux-android-cpp or -gcc or -g++ just as the script output says: 当我查看/Users/spartygw/android-ndk-r19//toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin ,没有aarch64-linux-android-cpp-gcc-g++如脚本输出所示:

     $ ls -1 ~/android-ndk-r19//toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin ./ ../ aarch64-linux-android-addr2line aarch64-linux-android-ar aarch64-linux-android-as aarch64-linux-android-c++filt aarch64-linux-android-dwp aarch64-linux-android-elfedit aarch64-linux-android-gprof aarch64-linux-android-ld aarch64-linux-android-ld.bfd aarch64-linux-android-ld.gold aarch64-linux-android-nm aarch64-linux-android-objcopy aarch64-linux-android-objdump aarch64-linux-android-ranlib aarch64-linux-android-readelf aarch64-linux-android-size aarch64-linux-android-strings aarch64-linux-android-strip 

This is where I think I got myself into trouble last time. 这是我认为上次遇到麻烦的地方。 I started hacking the script to get something that seemed to work and I'm sure what I did was wrong now. 我开始破解脚本,以获得似乎可以使用的功能,并且我确定自己现在做错了。

I really don't understand the process so I'm hoping for help. 我真的不理解该过程,因此希望能提供帮助。 Is anyone building arm64-v8a versions of OpenSLL successfully? 是否有人成功构建了OpenSLL的arm64-v8a版本?

I was able to build, link, and run openssl for android arm64 with NDK r19. 我能够使用NDK r19为Android arm64构建,链接和运行openssl。 But I had to use the standalone toolchain generated from android-ndk-r19. 但是我不得不使用从android-ndk-r19生成的独立工具链。

$ cd /path/to/android-ndk-r19
$ ./build/tools/make-standalone-toolchain.sh               \
            --toolchain=aarch64-linux-android

this will generate a dir called aarch64-linux-android in your tmp dir, put its bin directory in your path. 这将在您的tmp目录中生成一个名为aarch64-linux-android的目录,并将其bin目录放在您的路径中。 Also, set your ANDROID_NDK_HOME to this location. 另外,将您的ANDROID_NDK_HOME设置到此位置。

$ export PATH=/path/to/aarch64-linux-android/bin:${PATH}
$ export ANDROID_NDK_HOME=/path/to/aarch64-linux-android

then just run openssl's Configure and make. 然后只需运行openssl的Configure and make。

$ cd /path/to/openssl1.1.1
$ ./Configure android-arm64
$ make

./Configure's output was as follows: ./Configure的输出如下:

$ ./Configure android-arm64
Configuring OpenSSL version 1.1.1b-dev (0x10101020L) for android-arm64
Using os-specific seed configuration
Creating configdata.pm
Creating Makefile

**********************************************************************
***                                                                ***
***   OpenSSL has been successfully configured                     ***
***                                                                ***
***   If you encounter a problem while building, please open an    ***
***   issue on GitHub <https://github.com/openssl/openssl/issues>  ***
***   and include the output from the following command:           ***
***                                                                ***
***       perl configdata.pm --dump                                ***
***                                                                ***
***   (If you are new to OpenSSL, you might want to consult the    ***
***   'Troubleshooting' section in the INSTALL file first)         ***
***                                                                ***
**********************************************************************
$ 

and finally I created a new Android Studio project, with c++11, exceptions, and rtti support (through the new project wizard), and linked in the output of the build with a CMakeLists.txt slightly modified from the one created by Android Studio: 最后,我创建了一个新的Android Studio项目,该项目具有c ++ 11,异常和rtti支持(通过新项目向导),并在CMakeLists.txt的构建输出中进行了链接,该CMakeLists.txt与Android创建的项目略有修改工作室:

cmake_minimum_required(VERSION 3.4.1)

# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
# Gradle automatically packages shared libraries with your APK.

add_library( # Sets the name of the library.
             native-lib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp )

# Searches for a specified prebuilt library and stores the path as a
# variable. Because CMake includes system libraries in the search path by
# default, you only need to specify the name of the public NDK library
# you want to add. CMake verifies that the library exists before
# completing its build.

find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

# HERE ARE THE PARTS I EDITED:
# NOTE FOR THE COMMANDS ABOVE, THIS IS JUST THE OPENSSL SOURCE DIR.
set (SSL_PATH /path/to/ssl/build/outputs/)
include_directories(${SSL_PATH}/include)
set (open-ssl-libs ${SSL_PATH}/libssl.a ${SSL_PATH}/libcrypto.a)


# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.

target_link_libraries( # Specifies the target library.
                       native-lib
                       # LINK SSL AND CRYPTO HERE:
                        ${open-ssl-libs}
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

this is enough to show that it links, but I added one small reference to libssl.a in the boilerplate c++ code generated by Android Studio: 这足以表明它可以链接,但是我在Android Studio生成的样板c ++代码中为libssl.a添加了一个小引用:

#include <jni.h>
#include <string>
#include <openssl/ssl.h>

extern "C" JNIEXPORT jstring JNICALL
Java_com_vernier_android_test_1ssl_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {

    SSL* ssl = SSL_new(nullptr);
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

and I ran the app successfully. 并且我成功运行了该应用程序。

I was in trouble for addind SSL_PATH. 我在使用addind SSL_PATH时遇到了麻烦。 Solve it with 用解决

set (SSL_PATH ${CMAKE_SOURCE_DIR}/src/main/cpp/openssl)

CMAKE_SOURCE_DIR is already declared in Cmake. CMAKE_SOURCE_DIR已在Cmake中声明。

Assuming you already have an NDK, cd to the folder, enter /build/tools and run the following command. 假设您已经有一个NDK,将cd转到该文件夹​​,输入/build/tools并运行以下命令。 Replace the API with whatever you need and specify the folder where the standalone toolchain will be placed. 用所需的任何内容替换API,并指定将放置独立工具链的文件夹。

python make_standalone_toolchain.py --install-dir=<standalone_toolchain_folder> --arch=arm64 --api=22

With the path you used earlier, run the following. 使用先前使用的路径,运行以下命令。

export ANDROID_NDK_HOME=<standalone_toolchain_folder>

PATH=$ANDROID_NDK_HOME/bin:$PATH

Assuming you have already downloaded and extracted OpenSSL, cd into the folder and run the following commands. 假设您已经下载并解压缩了OpenSSL,将cd放入文件夹并运行以下命令。

./Configure android-arm64 no-asm

make clean

make

You will find that the .a and .so files for libcrypto and libssl have been placed in the OpenSSL folder. 您会发现libcryptolibssl.a.so文件已放置在OpenSSL文件夹中。 Remove the version suffix from the .so files if needed. 如果需要,请从.so文件中删除版本后缀。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM