最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

android串口開發(fā)入門之搭建ndk開發(fā)環(huán)境及第一個jni調(diào)用程序

 更新時間:2018年01月10日 11:11:47   作者:喝著啤酒寫bug  
這篇文章主要給大家介紹了關(guān)于android串口開發(fā)入門之搭建ndk開發(fā)環(huán)境及第一個jni調(diào)用程序的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

這幾天專門研究了下JNI編程,在網(wǎng)上找了好多資料,不過好多都是以前的,沒有更新,而且有的還是錯誤的,讓人不得不吐槽一把。所以覺得自己來一篇,本文將詳細介紹關(guān)于android搭建ndk開發(fā)環(huán)境及第一個jni調(diào)用程序的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(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ù)選框勾上,點擊Apply,然后就是等待ndk下載完成。

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

二:第一個jni程序

1:創(chuàng)建ndk項目

創(chuàng)建ndk項目和普通android項目有一點區(qū)別,需要把Include C++ support前面的復(fù)選框勾上,然后直接下一步。但在最后一步,有一個c++下拉框選項,可以根據(jù)你的實際情況適當(dāng)修改,C++ Standard :點擊下拉框,可以選擇標(biāo)準(zhǔn) C++,或者選擇默認 CMake 設(shè)置的 Toolchain Default 選項。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)志。

  

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

  

通過上圖看到,在External Build Files 下面多了一個CMakeLists.txt文件,該文件用于c程序需要生成so文件的配置文件。

cmake_minimum_required(VERSION 3.4.1):這是版本信息,我們不用管它

add_library():這個命令是,通過add.library()定義多個庫,CMake會去自動構(gòu)建他們,一個*.cpp文件對應(yīng)一個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òu)建腳本的其他地方使用這個變量,來代指 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幫我們自動生成好的,返回是一個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)用這個方法的對像(普通方法是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)如下

如果我們需要寫多個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,然后給文本組件賦值,軟件運行參見圖一

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命令的第一個參數(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運行結(jié)果:  

參考文章:

Android NDK 開發(fā)(五)AndroidStudio 2.2 NDK的開發(fā)環(huán)境搭建

一天掌握Android JNI本地編程 快速入門

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

最新評論

特克斯县| 隆安县| 垣曲县| 南华县| 松桃| 江北区| 手游| 克什克腾旗| 陵川县| 布尔津县| 虞城县| 周至县| 保康县| 双柏县| 彭山县| 仪陇县| 黄石市| 岳阳市| 新乡县| 南康市| 南部县| 明水县| 长岭县| 松桃| 永善县| 鄂伦春自治旗| 苍溪县| 夏邑县| 台北市| 修文县| 卢氏县| 景谷| 嘉义市| 平远县| 东宁县| 浮梁县| 神木县| 蓬溪县| 贵定县| 宜都市| 鄂托克前旗|