android串口開發(fā)入門之搭建ndk開發(fā)環(huán)境及第一個(gè)jni調(diào)用程序
前言
這幾天專門研究了下JNI編程,在網(wǎng)上找了好多資料,不過好多都是以前的,沒有更新,而且有的還是錯(cuò)誤的,讓人不得不吐槽一把。所以覺得自己來一篇,本文將詳細(xì)介紹關(guān)于android搭建ndk開發(fā)環(huán)境及第一個(gè)jni調(diào)用程序的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧。
一:ndk環(huán)境搭建
1:開發(fā)環(huán)境
我使用的是android studio 2.3.3版本,搭建ndk開發(fā)環(huán)境比較簡單,打開File----Settings----Appearance&Behavior----System Settings----Android SDK,選擇SDK Tools,將CMake,LLDB,NDK 前的復(fù)選框勾上,點(diǎn)擊Apply,然后就是等待ndk下載完成。

安裝成功后,右鍵項(xiàng)目----open module setting,Android NDK location會自動賦值

二:第一個(gè)jni程序
1:創(chuàng)建ndk項(xiàng)目
創(chuàng)建ndk項(xiàng)目和普通android項(xiàng)目有一點(diǎn)區(qū)別,需要把Include C++ support前面的復(fù)選框勾上,然后直接下一步。但在最后一步,有一個(gè)c++下拉框選項(xiàng),可以根據(jù)你的實(shí)際情況適當(dāng)修改,C++ Standard :點(diǎn)擊下拉框,可以選擇標(biāo)準(zhǔn) C++,或者選擇默認(rèn) CMake 設(shè)置的 Toolchain Default 選項(xiàng)。Exceptions Support :如果你想使用有關(guān) C++ 異常處理的支持,就勾選它。勾選之后,Android Studio 會在 module 層的 build.gradle 文件中的 cppFlags 中添加 -fexcetions 標(biāo)志。Runtime Type Information Support :如果你想支持 RTTI,那么就勾選它。勾選之后,Android Studio 會在 module 層的 build.gradle 文件中的 cppFlags 中添加 -frtti 標(biāo)志。

項(xiàng)目創(chuàng)建好后,app下多了一個(gè)cpp目錄,該目錄用于存放c程序的源碼,頭文件,預(yù)編譯項(xiàng)目等,android studio 會默認(rèn)幫我們創(chuàng)建一個(gè)native-lib.cpp文件,該文件已有一個(gè)測試方法,結(jié)構(gòu)圖如下:

通過上圖看到,在External Build Files 下面多了一個(gè)CMakeLists.txt文件,該文件用于c程序需要生成so文件的配置文件。
cmake_minimum_required(VERSION 3.4.1):這是版本信息,我們不用管它
add_library():這個(gè)命令是,通過add.library()定義多個(gè)庫,CMake會去自動構(gòu)建他們,一個(gè)*.cpp文件對應(yīng)一個(gè)add_library命令.
add_library( # Sets the name of the library.生成so文件的名字,建議和cpp文件同名 native-lib # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). 需要生成so文件的cpp文件名稱 src/main/cpp/native-lib.cpp )
find_library():定位 NDK library 的位置,并將其位置存儲在一個(gè)變量之中。在構(gòu)建腳本的其他地方使用這個(gè)變量,來代指 NDK library。下面的示例代碼將 Android-specific log support library 的位置存儲到變量 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 )
現(xiàn)在我們來看native-lib.cpp文件,這是as幫我們自動生成好的,返回是一個(gè)Hello from C++的字符串。
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring JNICALL
Java_serialport_com_ndkjnidemo_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
JNIEXPORT jstring JNICALL 這里的jstring代表返回值, 參數(shù)JNIEnv* env,代表指針,jobject 代表調(diào)用這個(gè)方法的對像(普通方法是jobject,靜態(tài)方法是jclass)后面的參數(shù)和java類中定義的本地方法對數(shù)相對應(yīng),方法命名規(guī)則:Java_包名_調(diào)用jni方法的類名_方法名,android studio 幫我們生成的程序,activity包名是serialport.com.ndkjnidemo,類名是MainActivity,方法名是stringFromJNI,所以native-lib.cpp方法名稱為Java_serialport_com_ndkjnidemo_MainActivity_stringFromJNI,其中返回值類型和java數(shù)據(jù)類型對應(yīng)如下

如果我們需要寫多個(gè)jni方法,*.cpp格式如下:
//方法一
extern "C"
JNIEXPORT jstring JNICALL
Java_serialport_com_ndkjnidemo_MainActivity_test1(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
//方法二
extern "C"http://如果不寫extern "C" java是無法調(diào)用到這里定義的方法
JNIEXPORT jstring JNICALL
Java_serialport_com_ndkjnidemo_MainActivity_test2(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
最后我們來看自動生成的MainActivity,在onCreate中調(diào)用stringFromJNI,然后給文本組件賦值,軟件運(yùn)行參見圖一
package serialport.com.ndkjnidemo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;public class MainActivity extends AppCompatActivity {
static { //native-lib值來自,CMakeLists.txt文件中,add_library命令的第一個(gè)參數(shù)
System.loadLibrary("native-lib");
}
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.sample_text); tv.setText(stringFromJNI());}public native String stringFromJNI();
}
代碼都是android studio自動自成的,所以此處不上傳代碼,demo運(yùn)行結(jié)果:

參考文章:
Android NDK 開發(fā)(五)AndroidStudio 2.2 NDK的開發(fā)環(huán)境搭建
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Android實(shí)現(xiàn)獲取簽名及公鑰的方法
這篇文章主要介紹了Android實(shí)現(xiàn)獲取簽名及公鑰的方法,可實(shí)現(xiàn)Android通過包名獲取相關(guān)簽名及公鑰的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android JNI c/c++調(diào)用java的實(shí)例
這篇文章主要介紹了Android JNI c/c++調(diào)用java的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-07-07
Android 滑動返回Activity的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 滑動返回Activity的實(shí)現(xiàn)代碼的相關(guān)資料,這里是訪微信滑動返回主頁的功能,需要的朋友可以參考下2017-07-07
android開發(fā)中ListView與Adapter使用要點(diǎn)介紹
項(xiàng)目用到ListView,由于要用到 ImageView ,圖片源不是在資源里面的,沒法使用資源 ID,因此無法直接使用SimpleAdapter,要自己寫一個(gè)Adapter。 在使用ListView和Adapter需要注意以下幾點(diǎn)2013-06-06
android基本控件ToggleButton&Switch使用指南
本文給大家匯總介紹了android的2個(gè)基本控件ToggleButton和Switch的使用方法,非常的詳細(xì),有需要的小伙伴可以參考下。2016-01-01
Kotlin協(xié)程低級api startCoroutine與ContinuationInterceptor
這篇文章主要為大家介紹了Kotlin協(xié)程低級api startCoroutine與ContinuationInterceptor示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Android中通過ActionBar為標(biāo)題欄添加搜索及分享視窗
這篇文章主要介紹了ANDROID中通過ACTIONBAR為標(biāo)題欄添加搜索以及分享視窗的相關(guān)資料,需要的朋友可以參考下2016-12-12

