Android - How to install .so file?



  • I am trying to include openSSL and cURL with my android application.
    I have built openSSL and cURL but seem unable to install the libssl.so and the libcrypto.so files to my device.
    Though I have now spent many hours I just can't seem to get this to work.
    Any help is appreciated!

    Regards,
    Ed


  • Qt Champions 2016

    @Ed-Buchwalter I'm just about to do the same for openssl and Qt 5.8
    Have you followed http://doc.qt.io/qt-5/opensslsupport.html to get the openssl .so libs ?



  • Hi,
    I followed the steps on:
    http://doc.qt.io/qt-5/opensslsupport.html
    to build Openssl, then I added to my .pro :

    LIBS += -L$$PWD/../../openssl/android/ -lcrypto -lssl
    INCLUDEPATH += $$PWD/../../openssl/android/openssl-1.0.2h/include/
    
    contains(ANDROID_TARGET_ARCH,armeabi-v7a) {
        ANDROID_EXTRA_LIBS = \
            $$PWD/../../openssl/android/libcrypto.so \
            $$PWD/../../openssl/android/libssl.so
    }
    

    for me it worked... hope it hepls!

    Luca


  • Qt Champions 2016

    and from another thread @Joseneas added the .so this way:

    To package the .so files into apk, add the below code into .pro file of the project:

    contains(ANDROID_TARGET_ARCH,arm) {
        # update the path of the libraries where you put in your project.
        # I put in: myapp/android/libs/openssl/armeabi-v7a/:
        ANDROID_EXTRA_LIBS = \
            $$PWD/android/libs/openssl/armeabi-v7a/libcrypto.so \
            $$PWD/android/libs/openssl/armeabi-v7a/ibssl.so
    }

  • Qt Champions 2016

    @luca so you don't copy the .so into the project - you always refer to one location. makes sense if many projects are using the libs



  • @ekkescorner Yes, I use the same .so for every project.


  • Qt Champions 2016

    @luca I'm not the cmd line expert - only a mobile app developer ;-)

    so please excuse my questions. am I right with my commands below ?

    CC=<ANDROID_NDK_PATH>/toolchains/arm-linux-androideabi-<VER>/prebuilt/<NDK_HOST>/bin/arm-linux-androideabi-gcc
    AR=<ANDROID_NDK_PATH>/toolchains/arm-linux-androideabi-<VER>/prebuilt/<NDK_HOST>/bin/arm-linux-androideabi-ar
    ANDROID_DEV=<ANDROID_NDK_PATH>/platforms/<ANDROID-PLATFORM>/arch-arm/usr
    

    will execute inside Terminal on OSX
    is -4.9 the correct version ?
    the <NDK_HOST> I found following the path as darwin-x86_64
    as <ANDROID-PLATFORM> I used the newest from r10e: android-21

    cd <directory-where extracted openssl>/openssl-1.0.2k
    export ANDROID_NDK_ROOT=/daten/_android/android-ndk-r10e
    CC=$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc
    AR=$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ar
    ANDROID_DEV=$ANDROID_NDK_ROOT/platforms/android-21/arch-arm/usr
    

    as next

    ./Configure shared android or android-armv7
    

    don't know what to choose - probably this:

    ./Configure shared android-armv7
    

    then doing the mentioned replaces and finally

    make build_libs
    

    will do the job ?

    thanks



  • @ekkescorner I followed those steps but I'm working on Linux so I can't confirm it works on Mac.

    I used:

    ./Configure shared android-armv7
    

    because that way you can cover almost all current Android devices.


  • Qt Champions 2016

    @luca thx - will try it out


  • Qt Champions 2016

    @luca did all.
    configuration was done

    did changes in Makefile

    then make build_libs fails:

    Configured for android-armv7.
    ekkes-MBP:openssl-1.0.2k admin$ make build_libs
    making all in crypto...
    /usr/bin/perl ../util/mkbuildinf.pl "gcc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -march=armv7-a -mandroid -I/include -B/lib -O3 -fomit-frame-pointer -Wall -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DAES_ASM -DBSAES_ASM -DGHASH_ASM" "android-armv7" >buildinf.h
    gcc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -march=armv7-a -mandroid -I/include -B/lib -O3 -fomit-frame-pointer -Wall -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DAES_ASM -DBSAES_ASM -DGHASH_ASM   -c -o cryptlib.o cryptlib.c
    clang: error: unknown argument: '-mandroid'
    make[1]: *** [cryptlib.o] Error 1
    make: *** [build_crypto] Error 1
    

    any idea what went wrong ?



  • @ekkescorner Do you get the same error if you try

    ./Configure shared android
    

    ?


  • Qt Champions 2016

    @luca just asked in interests list - perhaps I got some info there



  • @ekkescorner Ok,
    anyway I just tryed on my Linux PC and it worked:

    cd openssl-1.0.2h
    export AR=/home/luca/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar
    export CC=/home/luca/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
    export LD=/home/luca/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld
    export ANDROID_DEV=/home/luca/android-ndk-r10e/platforms/android-21/arch-arm/usr
    ./Configure shared android-armv7
    make depend
    make build_libs
    

  • Qt Champions 2016

    @luca difference is
    OSX
    1.0.2k

    and what does
    make depend ?


  • Qt Champions 2016

    @luca just also tried 1.0.2.h

    got info to execute make depend

    then error:

    Configured for android-armv7.
    
    *** Because of configuration changes, you MUST do the following before
    *** building:
    
    	make depend
    ekkes-MBP:openssl-1.0.2h admin$ make depend
    making depend in crypto...
    clang: error: unknown argument: '-mandroid'
    make[1]: *** [local_depend] Error 1
    make: *** [depend] Error 1
    

  • Qt Champions 2016

    @luca said in Android - How to install .so file?:

    @ekkescorner Do you get the same error if you try

    ./Configure shared android
    

    ?

    got the same error

    who has successfully installed openssl for Qt 5.8 on OSX ?


  • Qt Champions 2016

    @luca said in Android - How to install .so file?:

    @ekkescorner Ok,
    anyway I just tryed on my Linux PC and it worked:

    cd openssl-1.0.2h
    

    ...

    export LD=/home/luca/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ld

    why have you added this line ?
    and should I use 'export AR= and CC=' instead of AR= and CC= in docs ?

    thx again


  • Qt Champions 2016

    found https://github.com/openssl/openssl/issues/1531 and https://bruteforce.gr/bypassing-clang-error-unknown-argument.html
    and tried to add at first line
    ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future

    didn't work - same error
    also I guess GCC is used because of
    CC=$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc
    so the error shouldn't happen ?

    also found https://github.com/android-ndk/ndk/issues/5 mentioning 1.0.2g added -mandroid,
    so I tried downloading 1.0.2f
    same error

    I'm lost now - no one out there on OSX already added openssl libs to Qt 5.8 ?

    thx
    ekke



  • @ekkescorner I used "export" because otherwise my bash terminal didn't use the environmental variables.
    LD is used to force the android version of the linker. Don't know if you can avoid it.


  • Qt Champions 2016

    @luca said in Android - How to install .so file?:

    @ekkescorner I used "export" because otherwise my bash terminal didn't use the environmental variables.
    LD is used to force the android version of the linker. Don't know if you can avoid it.

    did the same

    now another error - probably the LD is only needed on Linux ?

    ekkes-MBP:openssl-1.0.2k admin$ make build_libs
    making all in crypto...
    /usr/bin/perl ../util/mkbuildinf.pl "/daten/_android/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -march=armv7-a -mandroid -I/include -B/lib -O3 -fomit-frame-pointer -Wall -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DAES_ASM -DBSAES_ASM -DGHASH_ASM" "android-armv7" >buildinf.h
    /daten/_android/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -march=armv7-a -mandroid -I/include -B/lib -O3 -fomit-frame-pointer -Wall -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DAES_ASM -DBSAES_ASM -DGHASH_ASM   -c -o cryptlib.o cryptlib.c
    In file included from cryptlib.c:117:0:
    cryptlib.h:62:21: fatal error: stdlib.h: No such file or directory
     # include <stdlib.h>
                         ^
    compilation terminated.
    make[1]: *** [cryptlib.o] Error 1
    make: *** [build_crypto] Error 1
    

  • Qt Champions 2016

    created a Bug: https://bugreports.qt.io/browse/QTBUG-59375 - will make it easier to follow


  • Qt Champions 2016

    from Android list I got a link to: https://github.com/orangefour/android-openssl

    cloned this repo, modified pathes in .pri

    build and run app on Android 7 and it works - so I can go on :)

    but this way is no solution for my projects because prebuilt .so are used
    would be a security hole

    so I'm still waiting for an answer HowTo install openssl on OSX following https://github.com/orangefour/android-openssl


  • Qt Champions 2016

    finally did it the secure way and built from openssl sources on OSX :)

    used the .sh scripts from https://github.com/orangefour/android-openssl

    in Terminal:

    cd <path/to/scripts>
    chmod 755 ./build-all-arch.sh
    chmod 755 ./setenv-android-mod.sh
    export ANDROID_NDK_ROOT=/daten/_android/android-ndk-r10e
    export OPENSSL_VERSION="openssl-1.0.2k"
    ./build-all-arch.sh
    

    inside projects adding a .pri pointing to the .so files:

    android {
      ANDROID_EXTRA_LIBS += $$PWD/my/path/to/prebuilt/armeabi-v7a/libcrypto.so
      ANDROID_EXTRA_LIBS += $$PWD/my/path/to/android-openssl/prebuilt/armeabi-v7a/libssl.so
    }
    

    will blog about in detail


  • Qt Champions 2016

    and here's my github repo

    https://github.com/ekke/android-openssl-qt

    blogpost will follow



  • @ekkescorner Thanks for sharing !



  • Hi, could you share the .so files?
    I cant't compiled them, I'm in a windows box.

    thanks


  • Qt Champions 2016

    @Tiago-Torre-do-Vale take a look at https://github.com/orangefour/android-openssl - there are .so files

    from my POV it's not recommended to use prebuilt .so files for libs like ssl and crypto.

    the scripts should also work on windows. you should have installed cygwin or so.
    I'm doing all my dev work on osx but I'm sure others will help you to make the .sh work on windows



  • Hi, thanks !!!
    I managed to work with the prebuilt.


  • Qt Champions 2016

    @Tiago-Torre-do-Vale great to hear
    Attention: APP can randomly crash if executing some requests via QNAM
    I opened another tread on this: https://forum.qt.io/topic/77150/qt-5-8-qnam-openssl-crash-openssl_threads



  • Hi,

    I did libcrypt.so and libssl.so using ./Configure shared android because ./Configure shared android-armv7 said that target was not existing.
    I include the .so files in my Qt Project but still have crach with XMLHttpRequest.

    Get openSSL with android or android-armv7 change something?



  • Hi!

    A few days ago I compiled libcrypto and libssl for android (arm-linux-androideabi) because android 7 does not provide access to openssl.
    You can find the .so files here:
    https://github.com/bkweb/openssl-1.0.2k-prebuilt-for-android

    In the README.md file I give some instructions for including the files in a Qt-project and how to view the version of the openssl suite in use.
    The Google App Store accepts my apps with these files.

    Best regards,
    Björn


Log in to reply