作者簡(jiǎn)介
微信公眾號(hào)(高質(zhì)量文章推送):走向全棧工程師
作者:陳博易
聲明:本文是個(gè)人原創(chuàng)蝌箍,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載
商業(yè)合作請(qǐng)?jiān)谖⑿殴娞?hào)回復(fù):聯(lián)系方式
前言
- 為什么要學(xué)習(xí)JNI呢宪肖,我的回答是:因?yàn)槲液脤W(xué)!哈哈哈
- 因?yàn)閏/c++比Java效率高脐区,所以應(yīng)用運(yùn)行起來速度比較快夺溢,特別是一些游戲中的算法。
- 為了保密抢蚀,都知道apk都可以被反編譯,就算有代碼混淆镰禾,也只是難看懂皿曲,并不是完全看不懂,但用jni編譯成.so就不同了吴侦,可以使破解的難度更加大屋休。
- 一個(gè)平臺(tái)(C++代碼)遷移到Android平臺(tái),底層邏輯是相同的备韧,這樣就可以通過移植劫樟,利用JNI調(diào)用底層C++代碼,避免相同邏輯的代碼重復(fù)去寫,不過這個(gè)過程一定要注意底層對(duì)象的釋放問題毅哗。
環(huán)境以及工具
- Android項(xiàng)目:AndroidStudio3.0
- NDK
- CMake3.6.4
- LLDB3.0
整體步驟
- AndroidStudio 3.0 NDK環(huán)境搭建
- NDK入門案例目錄介紹
- NDK入門案例代碼介紹
核心步驟解讀
1. NDK環(huán)境搭建
解釋說明一下為什么需要在sdk tools中下載 ndk cmake LLDB呢听怕?
- NDK:讓我們可以在 Android 上面使用 C 和 C++ 代碼的工具集。
- cmake:是外部構(gòu)建工具虑绵。如果你已經(jīng)知道如何使用ndk-build的話尿瞭,可以不使用它。
- LLDB: 可以在Android Studio上調(diào)試本地代碼
2.NDK入門案例目錄介紹
- cpp 文件夾存放你所有 native 代碼的地方翅睛,例如:c c++語言
- CMakeLists.txt 存放 CMake 或 ndk-build 構(gòu)建腳本的地方
- externalNativeBuild是構(gòu)建工具自動(dòng)生成的文件
3.NDK入門案例代碼介紹
MainActivity中的代碼介紹
- 加載類庫
- 聲明native方法
- 調(diào)用方法
public class MainActivity extends AppCompatActivity {
// Used to load the 'native-lib' library on application startup.
//在應(yīng)用開啟的時(shí)候就加載native-lib
static {
System.loadLibrary("native-lib");
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
//本地方法在java類中的聲明声搁,具體實(shí)現(xiàn)在'native-lib' native library
public native String stringFromJNI();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Example of a call to a native method
TextView tv = (TextView) findViewById(R.id.sample_text);
//調(diào)用jni中的方法
tv.setText(stringFromJNI());
}
}
native-lib.cpp中代碼介紹:
app/CMakeLists.txt構(gòu)建腳本翻譯:
# For more information about using CMake with Android Studio, read the
# documentation: https://d.android.com/studio/projects/add-native-code.html
#CmakeLists.txt翻譯:對(duì)于更多Android Studio使用CMake的文檔信息,請(qǐng)
#閱讀documentation: https://d.android.com/studio/projects/add-native-code.html
# Sets the minimum version of CMake required to build the native library.
#指定CMake編譯器的最低版本3.4.1
cmake_minimum_required(VERSION 3.4.1)
#設(shè)置生成的so動(dòng)態(tài)庫最后輸出的路徑
#它將會(huì)把生成的so庫按照你在 build.gradle 指定的 abi分別放置在 jniLibs下
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI})
# 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.
#CmakeLists.txt翻譯:創(chuàng)建一個(gè)類庫的name,設(shè)置這個(gè)類庫為STATIC
#或者SHARED類型捕发,并且設(shè)置c或者c++的源代碼的的相對(duì)路徑疏旨。
#你可以定義多個(gè)類庫,同事CMake會(huì)為你構(gòu)建扎酷。
#Gradle可以自動(dòng)將shared類庫打包到你的APK中檐涝。
# CMake根據(jù)指定的源文件生成庫文件
add_library(
# Sets the name of the library
#設(shè)置類庫的名字
native-lib
# Sets the library as a shared library.
#生成的庫的類型[SHARED|STATIC|MODULE]
#SHARED庫會(huì)被動(dòng)態(tài)鏈接,在運(yùn)行時(shí)被加載
#STATIC庫是在鏈接其它目標(biāo)的時(shí)候使用
SHARED
# Provides a relative path to your source file(s).
#指定路徑下的源文件代碼法挨,可以為這個(gè)類庫指定多個(gè).cpp文件
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.
#CmakeLists.txt翻譯:搜索指定構(gòu)建庫并將變量作為存儲(chǔ)路徑谁榜。
#因?yàn)镃make構(gòu)建工具默認(rèn)包含了系統(tǒng)類庫,你僅僅需要指定你想要添加的公共NDK類庫的name.
#CMake構(gòu)建工具會(huì)在完成構(gòu)建之前校驗(yàn)指定的類庫name是否存在
# 將NDK log類庫的位置存儲(chǔ)到變量 log-lib中
#可以在構(gòu)建腳本的其他地方使用這個(gè)變量 ${log-lib}
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 )
# 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.
#CmakeLists.txt翻譯:指定類庫 CMake構(gòu)建工具會(huì)連接到你的目標(biāo)類庫中凡纳。
#你可以連接到多個(gè)類庫中窃植,例如:在這個(gè)CmakeLists.txt的構(gòu)建腳本中定義的類庫,
#預(yù)構(gòu)建的第三方類庫或者系統(tǒng)類庫荐糜。
#為生成的目標(biāo)類庫指定需要的庫文件
target_link_libraries(
# Specifies the target library.
#生成的目標(biāo)庫文件
native-lib
# Links the target library to the log library
# included in the NDK.
#需要在目標(biāo)庫文件中使用的庫巷怜,表示可以在native-lib中使用log-lib庫的內(nèi)容
${log-lib} )
app/build.gradle構(gòu)建文件代碼介紹
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.example.administrator.ndk"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//Gradle 文件配置對(duì)CMake的配置
externalNativeBuild {
cmake {
cppFlags ""
}
}
//Gradle 構(gòu)建并打包某個(gè)特定abi體系架構(gòu)下的.so庫
ndk {
// Specifies the ABI configurations of your native
// libraries Gradle should build and package with your APK.
abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
'arm64-v8a'
}
}
buildTypes {
release {
}
}
//Gradle 文件配置對(duì)CMake的配置
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
總結(jié)
- 請(qǐng)大家多關(guān)注關(guān)注我。
- 聲明的public native String stringFromJNI()方法和Java_com_example_administrator_ndk_MainActivity_stringFromJNI中的stringFromJNI要一致暴氏。
個(gè)人相關(guān)教程
各種大佬推薦的編程視頻資源分享
Android 微信 支付寶支付延塑,2行代碼實(shí)現(xiàn)支付
Android前端 Java后端 集成支付寶支付
postman使用 Android java后端 接口調(diào)試工具
Android抓包 Charles http接口調(diào)試
消息推送 Android java后端集成小米推送
如何導(dǎo)入簡(jiǎn)單的java項(xiàng)目-IntelliJ IDEA
請(qǐng)關(guān)注我(高質(zhì)量文章推送)
源碼地址———關(guān)注微信公眾號(hào),回復(fù):ndk環(huán)境搭建