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????????????????????????????