java 开源so库_NDK使用之引用.so开源库
上一篇中總結了直接引用c/c++源碼,但是當源碼的量很大時,我們無法直接引用源碼,因為量太大了,編譯一次需要很長的時間,所以這時候我們就需要先預編譯出.so包或者.a包,然后再引用,這時候編譯就非常快了。
上一篇中已經介紹了如何將項目配置為ndk項目,這篇就不再贅述了,下面就以FFMPeg為例,直接進入正題。
編譯FFMPeg
這也不是本文的重點,我在之前的文章中也整理過如何編譯FFMPeg,其實也整理過如何集成FFMPeg,但是本篇的方式更加簡單直接一點。
添加so包
這里我編譯出來的是armeabi-v7a架構下的so包,所以把編譯好的so包放入到lib/armeabi-v7a目錄下,然后在該module的build.gradle文件的android->defaultConfig下邊添加:
externalNativeBuild {
cmake {
cppFlags ""
abiFilters "armeabi-v7a"
}
}
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
然后再在CMakeLists文件下,添加
set(FF ${CMAKE_SOURCE_DIR}/../../../libs/${ANDROID_ABI})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${FF}")
第一句的意思是把lib/armeabi-v7a下的文件列表賦值給變量FF
第二句的意思添加動態鏈接庫到cxx_flags上,編譯時編譯器就能找到該目錄
注意:因為在上文配置的abiFilters只有armeabi-v7a,所以FF變量就是lib/armeabi-v7a下的文件列表
添加頭文件
把編譯得到的include文件整個文件夾拷貝到cpp目錄下,然后使用
include_directories(include)
就能直接把頭文件引用進來了
添加一個庫
例如這里添加一個叫player_util的庫,包含了cpp下所有的c++源碼:
file(GLOB SOURCES *.cpp)
add_library(
player_util
SHARED
${SOURCES})
將FFMPeg庫鏈接到player_util上
最后還需要把之前添加進來的so庫連接到我們創建的這個player_util庫上,這樣我們才能引用到,代碼如下:
target_link_libraries(player_util
avformat avcodec avutil swresample swscale
log z OpenSLES android)
注意第二行FFMPeg這幾個庫的順序,因為前邊的引用了后邊的庫,所以需要把引用的庫按照這個順序連接進來才行,第三行的事Android內部的so庫,因為要視頻的解碼和渲染的話就需要用到。
至此引用so庫的方式也介紹完了。
總結
以上是生活随笔為你收集整理的java 开源so库_NDK使用之引用.so开源库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java输错重新输入_java程序在do
- 下一篇: 特斯拉 Powerwall 用户参与加州