91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android串口開發入門之搭建ndk開發環境及第一個jni調用程序

發布時間:2020-08-29 09:42:54 來源:腳本之家 閱讀:161 作者:喝著啤酒寫bug 欄目:移動開發

前言

這幾天專門研究了下JNI編程,在網上找了好多資料,不過好多都是以前的,沒有更新,而且有的還是錯誤的,讓人不得不吐槽一把。所以覺得自己來一篇,本文將詳細介紹關于android搭建ndk開發環境及第一個jni調用程序的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

一:ndk環境搭建

1:開發環境

我使用的是android studio 2.3.3版本,搭建ndk開發環境比較簡單,打開File----Settings----Appearance&Behavior----System Settings----Android SDK,選擇SDK Tools,將CMake,LLDB,NDK 前的復選框勾上,點擊Apply,然后就是等待ndk下載完成。

android串口開發入門之搭建ndk開發環境及第一個jni調用程序

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

android串口開發入門之搭建ndk開發環境及第一個jni調用程序

二:第一個jni程序

1:創建ndk項目

創建ndk項目和普通android項目有一點區別,需要把Include C++ support前面的復選框勾上,然后直接下一步。但在最后一步,有一個c++下拉框選項,可以根據你的實際情況適當修改,C++ Standard :點擊下拉框,可以選擇標準 C++,或者選擇默認 CMake 設置的 Toolchain Default 選項。Exceptions Support :如果你想使用有關 C++ 異常處理的支持,就勾選它。勾選之后,Android Studio 會在 module 層的 build.gradle 文件中的 cppFlags 中添加 -fexcetions 標志。Runtime Type Information Support :如果你想支持 RTTI,那么就勾選它。勾選之后,Android Studio 會在 module 層的 build.gradle 文件中的 cppFlags 中添加 -frtti 標志。

   android串口開發入門之搭建ndk開發環境及第一個jni調用程序

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

  android串口開發入門之搭建ndk開發環境及第一個jni調用程序

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

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

add_library():這個命令是,通過add.library()定義多個庫,CMake會去自動構建他們,一個*.cpp文件對應一個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 的位置,并將其位置存儲在一個變量之中。在構建腳本的其他地方使用這個變量,來代指 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 )

現在我們來看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代表返回值, 參數JNIEnv* env,代表指針,jobject 代表調用這個方法的對像(普通方法是jobject,靜態方法是jclass)后面的參數和java類中定義的本地方法對數相對應,方法命名規則:Java_包名_調用jni方法的類名_方法名,android studio 幫我們生成的程序,activity包名是serialport.com.ndkjnidemo,類名是MainActivity,方法名是stringFromJNI,所以native-lib.cpp方法名稱為Java_serialport_com_ndkjnidemo_MainActivity_stringFromJNI,其中返回值類型和java數據類型對應如下

android串口開發入門之搭建ndk開發環境及第一個jni調用程序

如果我們需要寫多個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是無法調用到這里定義的方法
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中調用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命令的第一個參數
  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運行結果:  

android串口開發入門之搭建ndk開發環境及第一個jni調用程序

參考文章:

Android NDK 開發(五)AndroidStudio 2.2 NDK的開發環境搭建

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吉安市| 宁都县| 鹤岗市| 莆田市| 丁青县| 延吉市| 昌都县| 西安市| 崇左市| 曲阜市| 阜阳市| 新和县| 建昌县| 通渭县| 潜江市| 漾濞| 平塘县| 耒阳市| 广宗县| 图木舒克市| 惠东县| 迁安市| 宜阳县| 常德市| 福贡县| 临洮县| 高阳县| 昭苏县| 扬州市| 弋阳县| 宁津县| 温宿县| 蕉岭县| 徐州市| 阿尔山市| 集安市| 余干县| 彭泽县| 莫力| 织金县| 静安区|