android 串口開發第一篇:搭建ndk開發環境以及第一個jni調用程式

来源:https://www.cnblogs.com/cq-jiang/archive/2017/12/29/8145281.html
-Advertisement-
Play Games

一:ndk環境搭建 1:開發環境 我使用的是android studio 2.3.3版本,搭建ndk開發環境比較簡單,打開File Settings Appearance&Behavior System Settings Android SDK,選擇SDK Tools,將CMake,LLDB,NDK ...


一:ndk環境搭建

     1:開發環境

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

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

  

 二:第一個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 標誌。

                                                          

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

  

      通過上圖看到,在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 代表調用這個方法的對像,方法命名規則:Java_包名_調用jni方法的類名_方法名,android studio 幫我們
生成的程式,activity包名是serialport.com.ndkjnidemo,類名是MainActivity,方法名是stringFromJNI,所以native-lib.cpp方法名稱為:Java_serialport_com_ndkjnidemo_MainActivity_stringFromJNI,其中返回值類型和java數據類型對應如下

    如果我們需要寫多個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"//如果不寫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 開發(五)AndroidStudio 2.2 NDK的開發環境搭建

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

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述 本章節介紹Insert、Update、Delete、Drop操作基本語法。 環境: Version:3.4 insert insert()基本語法如下: db.collection.insert( <document or array of documents>, { writeConcern ...
  • 環境:oracle 12.1.0.2 rac ,4節點 一、概述 通常來說,如果是oltp應用,那麼部署在rac上,是不錯的註意。 但實現情況中,往往是混合類型,既有OLTP也有OLAP。 如果沒有很好地進行資源管理和系統設計,那麼系統的性能往往不如人意。 造成系統慢的原因很多,其中一個就是orac ...
  • 在centos中安裝mysql詳細步驟說明 條件:需要兩個虛擬機,一臺為主伺服器master,一臺為從伺服器slave 1 在master主服務中,創建用於同步的用戶 mysql> grant all privileges on *.* to 'rpl'@'192.168.178.162' iden ...
  • 後端開發:1、高級java軟體架構師實戰培訓視頻教程2、大型SpringMVC,Mybatis,Redis,Solr,Nginx,SSM分散式電商項目視頻教程3、Spark Streaming實時流處理項目實戰4、Java校招面試 Google面試官親授5、Java開發企業級許可權管理系統6、Java ...
  • Where exists 2之前按照個人理解講了基本的select 用法。當然 exists 並不僅僅只能更在select之後。比如update 也可以使用 where exists 繼續之前的講解,我從網上看到說。Where exists 和 In 效率不一樣,就來做個試驗對比一下如何不同。首先創 ...
  • 最近新接觸Mysql,昨天新建一個表用於存儲表結構信息: 然後查詢tablist表: 看看有哪些列沒有comment於是: select * from tablist where COLUMN_COMMENT is null; 查到的結果居然是Empty set。不過從以上查詢結果和navicat都 ...
  • CocoaPods安裝使用詳解 2017.12 首先,很有必要瞭解一下CocoaPods、Ruby和RubyGems,以及它們之間的關係。 CocoaPods是第三方庫的輔助管理工具,依賴於Ruby。 Ruby是一種簡捷的面向對象腳本語言。 RubyGems相當於Ruby的一個管理工具。 以下幾個官 ...
  • 在工作中有時候需要把activity當成dialog使用,其實做法挺簡單的。 1、設置activity的style 2、把該style應用給該activity 要註意一點,如果style的parent是:@android:style/Theme.Dialog,如上面所示 那麼該DialogActiv ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...