NDK學習筆記(三)SWIG:自動生成JNI代碼

編寫JNI封裝器的代碼,還有處理數據類型的轉換耗時且費力,因此要用到 SWIG。html

SWIG 的全稱是 Simplified Wrapper and Interface Generator,它是一個開發工具,在Android Native開發中可被用來自動生成須要的 JNI 封裝器代碼。java

固然,SWIG 不僅是能被用在 Android 和 Java 開發領域,它是一個擴展性方面很強大的工具,也能夠用來自動生成其它編程語言的代碼。編程

當期用於 Android Native 開發中時,須要瞭解以下一些知識:windows

  • 定義原生代碼的 SWIG 接口。
  • 基於定義的接口生成 JNI 代碼。
  • 將 SWIG 集成到 Android 的構建流程中。
  • 封裝 C/C++ 代碼。
  • 異常處理。
  • 使用內存管理。
  • 原生代碼調用 Java。

關於SWIG

SWIG是一個運用於編譯環節的軟件開發工具,它能生成出代碼來使得用 C/C++ 編寫的代碼能夠同其它編程語言鏈接在一塊兒。安全

SWIG以接口文件做爲輸入,輸出的是特定語言(如Java)的代碼文件,輸出的文件直接能夠編譯運行。app

SWIG誕生於1995年,開始的時候用於科研,現在做爲通用工具在以 GUI GPL 協議開放了源代碼,官網是:www.swig.org。編程語言

SWIG在三大主力平臺均可以安裝,下載地址:www.swig.org/download.html,windows 中下載到的是一個zip壓縮包,解壓而後配置好環境變量(SWIG_HOME,Path)便可使用了。函數

示例,獲取Linux 用戶 ID

Android 平臺基於 Linux OS 構建,Linux 是一個多用戶平臺,Android 利用了這一點,在其上的每一個APP都是在不一樣 Linux 用戶下的虛擬機沙盒中運行的,這樣具備安全性方面的好處。Java 不能直接獲取到 Linux 的用戶 ID,所需必須經過 Native 的方式調用原生 POSIX OS API 中的 getuid 才能獲取到。流程以下:工具

  • 編寫一個SWIG接口文件暴露出 getuid 函數。
  • 將 SWIG 集成到 Android 構建流程。
  • 將 SWIG 生成的源代碼文件添加到 Android.mk 構建文件。
  • 使用 SWIG 生成的 Java 代理類來查詢 getuid 函數。
  • 在 APP 界面上顯示結果。

SWIG 接口文件

接口文件包含了函數原型、類以及變量的聲明。語法同普通的 C/C++ 頭文件相同,不過除了能夠在其中使用 C/C++ 關鍵詞以及預處理指令之外,還包含了 SWIG 特有的指令,利用它們能生成封裝的代碼。開發工具

接口文件能夠被放在Android工程的jni目錄下,後綴名爲.i,例如:Unix.i。

在命令行中運行 swig 命令就能夠在相應文職生成原生代碼和Java代理類,例如:

swig -java -package com.apress.swig -outdir src/com/apress/swig jni/Unix.i

咱們能夠在 Android 的Java類中調用生成的 Java 代理類中暴露的方法來實現對原生功能函數的調用。

實現原生代碼調用 Java

這在回調場景中能夠被用到,對於處理一些延時長操做比較有用。

相關文章
相關標籤/搜索