­

Android:JNI与NDK(二)交叉编译与动态库,静态库

  • 2019 年 10 月 3 日
  • 筆記

 

???????????????????

 

????

????

?????window???????????NDK???????????????????window?????????????mac ,linux?????????????

???????A????????B??????????????????????????window??mac??linux???????????????????????????????????????????????ffmpeg?opengl es?????????????window??mac??linux???????????????????????????????????????????????

????????????????????????????????CMake???????????????????????????????????CMake???????????????????

?????????????MinGW(C/C++???)??????????????????????????????????????????????????????????????????????????????????????17c????

??????????

????????????????

????C/C++???????C/C++??????

??C/C++???
????? ??
clang clang ???C?C++?Object-C??????????LLVM?LLVM??C++??????????????????????????????????,??gcc??????????????????????????????clang???????????????????
gcc GNU C??????????C?????????????C++?(GNU??????????????????????????)
g++ GNU c++???????.c?????gcc?????C????g++???C++??????.cpp?????????c++???g++?????c++???stl?gcc???gcc????__cplusplus???g++?
C/C++??????

C/C++????????????????????????????

???? ????
??? ?????????include?define????#include?????.h ?????#include????????????????#define?????????????
?? ???????????????????????????????????????????
?? ????? .s??????????????.o,??????.c, .i, .s????????
?? ?????????????????????????c/c++???????????????????????????????????????

????????????????

1 gcc -o d:main C:Userswanglei55Desktopmain.c

?C:Userswanglei55Desktopmain.c??????????????d????main??????????????????????????

?????????C/C++????????C/C++?????????????????

??????

?????????????????????????window?????????????

??????C???
main.c

1 #include <stdio.h>  2 int main()  3 {  4    int nn = 55;  5    printf("nn = %dn", nn);  6    return 0;  7 }

???????????????????main.c?gcc???????????????????

1 gcc -o d:main C:Userswanglei55Desktopmain.c

?????d??????mian.exe??(window?????????.exe?mac/linux??????)?

???????????????????????

?????????window?????????????????????????????????????????????????????????????????????????????????.exe???????????????linux?????????????.exe??????linux?????????????????????????????????CPU?????????????????

??????main.c???????????????????????????????????window?????????????????????????????????????????????????????????????????????????????17c????

???????zip????

???(????????)???toolchains???????????????????????cpu??arm????????arm?????

???????????????gcc????

 

??????????????gcc??????main.c????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

??cd?arm-linux-androideabi-gcc.exe????????????

1 arm-linux-androideabi-gcc.exe -o d:main C:Userswanglei55Desktopmain.c

???????????

?????????????????????????stdio.h????????????stdio.h???????

??????????????

?????????????????????????

???? ??
–sysroot=XX ??xx?????????????????????????? usr/include usr/lib???–sysroot??????????????
-isysroot XX ?????????,??–sysroot ??? XX/usr/include??????
-isystem XX ??????????????????
-IXX ????????I????

?????????????????

????????????????????stdio.h???????stdio.h??????????android-ndk-r17c-windows-x86_64android-ndk-r17csysrootusrinclude

??????????????????????????-isystem?????

1 arm-linux-androideabi-gcc.exe -isystem C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17csysrootusrinclude -o d:main C:Userswanglei55Desktopmain.c

???????????????

??? asm/types.h???????????????????????stdio.h???????

????????????????????????????android-ndk-r17c-windows-x86_64android-ndk-r17csysrootusrincludearm-linux-androideabi

????????????????

1 arm-linux-androideabi-gcc.exe -isystem C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17csysrootusrinclude -isystem C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17csysrootusrincludearm-linux-androideabi -o d:main C:Userswanglei55Desktopmain.c

?????????

????????????????????????????????????????????????main.c??????”printf”????????????????”stdio.h”??????????????????????????libc.so??????????????????????????????????????????

???? ??
–sysroot=XX ??????–sysroot=XX???????????????????
-LXX ?????????
-lxx ???????????????libc.so?????????-lc ?lib?.so???

printf?????????libc.so????????libc.so???????????

???????????????????????????????????

1 arm-linux-androideabi-gcc.exe --sysroot=C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17cplatformsandroid-22arch-arm -lc -isystem C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17csysrootusrinclude -isystem C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17csysrootusrincludearm-linux-androideabi -o d:main C:Userswanglei55Desktopmain.c

?????????????????????????????????????? -pie ????????

1 arm-linux-androideabi-gcc.exe --sysroot=C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17cplatformsandroid-22arch-arm -lc -isystem C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17csysrootusrinclude -isystem C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17csysrootusrincludearm-linux-androideabi -pie -o d:main C:Userswanglei55Desktopmain.c

???????????????????????

?????????????????????????????????????????????????????????????????????????ndk???????????????cmake??mk?????????????????????????????????????????

???????????????

?????????????????????????????????????????????????

?????
test.c

1 #include <stdio.h>  2 int test(){  3    return 999;  4 }

???????test?????int?999???????????????????????????????

???????

??????????????? -fPIC -shared????????????????

1 arm-linux-androideabi-gcc.exe --sysroot=C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17cplatformsandroid-22arch-arm -lc -isystem C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17csysrootusrinclude -isystem C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17csysrootusrincludearm-linux-androideabi -fPIC -shared C:Userswanglei55Desktoptest.c -o d:libTest.so

????????test.c????test.c????????d????libTest.so?????????????????libTest.so?????test()???

?????????????libTest.so?????

??????????????so?????????jniLibs?

??????native-lib.cpp?????libTest.so???test()???????c++?????c??????????test()??????????????

1 //C++???C???????????C++????C???????????  2 extern "C"{  3    extern int test();  4 }

??test()?????

 1 JNIEXPORT jstring JNICALL   2 Java_com_wanglei55_ndk_MainActivity_stringFromJNI(JNIEnv *env,jobject /* this */) {   3   4    LOGE("libTest.so????test()???????%d", test());   5    int i = test();   6    std::string s1 = std::to_string(i);   7    std::string s2 = "Hello from C++";   8    std::string s = s1 + s2;   9    return env->NewStringUTF(s.c_str());  10 }

????????CMakelist.txt????????????????????libTest.so????

 1 # CMAKE_CXX_FLAGS ???c++???   2 # CMAKE_C_FLAGS ???c???   3 # CMAKE_SOURCE_DIR ?????CMakelist.txt????   4 #???-L?????????????   5 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/src/main/jniLibs/armeabi-v7a")   6   7 # ????-l??????????   8 target_link_libraries( # Specifies the target library.   9                       native-lib  10                       # libTest.so ????lib?.so  11                       Test  12                       # Links the target library to the log library  13                       # included in the NDK.  14                       ${log-lib} )

???????????????????????????????????????

????????????so????????????????????

???????

???????staticTest.c???

1 #include <stdio.h>  2 int staticTest(){  3    return 666;  4 }

???staticTest.c??????????????????
???????????gcc???.o????????

1 arm-linux-androideabi-gcc.exe --sysroot=C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17cplatformsandroid-22arch-arm -lc -isystem C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17csysrootusrinclude -isystem C:Userswanglei55Desktopandroid-ndk-r17c-windows-x86_64android-ndk-r17csysrootusrincludearm-linux-androideabi -fPIC -c C:Userswanglei55DesktopstaticTest.c -o d:staticTest.o 

?????ar?????????staticTest.o ????libStaticTest.a???????????????staticTest.o??????????????

1 arm-linux-androideabi-ar.exe r d:libStaticTest.a C:Userswanglei55DesktopstaticTest.o

ar?gcc???????

???????????????????????????????jniLibs????????????????????????

????????????int staticTest()????

 1 extern "C"{   2    extern int test();   3    extern int staticTest();//?????????   4}   5   6 extern "C"   7 JNIEXPORT jstring JNICALL   8 Java_com_wanglei55_ndk_MainActivity_stringFromJNI(JNIEnv *env,jobject /* this */) {   9  10    LOGE("libTest.so????test()???????%d", test());  11    LOGE("libStaticTest.a????staticTest()???????%d", staticTest());  12    int i = test();  13    int j = staticTest();  14    std::string s1 = std::to_string(i);  15    std::string s2 = std::to_string(j);  16    //std::string s2 = "Hello from C++";  17    std::string s = s1 +":::"+s2;  18    return env->NewStringUTF(s.c_str());  19 }

???????????????????????????????????????????CMakeLists.txt???????????

 1 ???   2 #?????   3 # IMPORTED: ????????????????(??????)   4 add_library(StaticTest STATIC IMPORTED)   5 ???   6 #??????????   7 set_target_properties(StaticTest PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/static/armeabi-v7a/libStaticTest.a)   8   9 #??native-lib???????Test StaticTest log???????  10 target_link_libraries( # Specifies the target library.  11                       native-lib  12                       # libTest.so ????lib?.so  13                       Test  14                       StaticTest  15                       # Links the target library to the log library  16                       # included in the NDK.  17                       log )

??????????????????????????

??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

????????????

????????????????????????????????????java?????????jar???????????????????aar??????C/C++???????????????????????????????????

Linux??????.a????????.so???

???????????????

???

?????????????????????????????????????????????????????????????????

??????????????????????????

????????????????????,???, ?????????. ??????????

???

????????????????????????????????????????????, ??????????????????

?????????????, ???????????????????????????????????

?????????????????????????????????

???????????????????????????

?????????????????????????????????????????????????????????????????????

????

?????????????????????????????????????????????????????????????????????????????????????????????????ffmpeg????????????????????????????