JNI開發(fā)流程之淺談①

先了解一二

Windows 上的安裝c環(huán)境

  1. 下載 min-gw 安裝程,可自行百度mingw-get-setup.exe,安裝后配置環(huán)境變量如 C:\MinGw\bin
  2. 命令行安裝相應(yīng)插件
  • mingw-get install gcc
  • mingw-get install g++
  • mingw-get install gdb

第一個c程序

那我們第一件事肯定是來個helloworld,首先新建文件hello.c,如下

# include <stdio.h>
int main()
{
    printf("%s\n","hello world");
    return 0;
}

然后執(zhí)行命令g++ hello.c,會生成一個a.exe文件,直接執(zhí)行就能看到我們打印的hello world

D:\androidDemo\Jni1>g++ test.c
D:\androidDemo\Jni1>a.exe
hello world

c之初識

  • C 語言最初是用于系統(tǒng)開發(fā)工作,特別是組成操作系統(tǒng)的程序。由于 C 語言所產(chǎn)生的代碼運行速度與匯編語言編寫的代碼運行速度幾乎一樣,所以采用 C 語言作為系統(tǒng)開發(fā)語言。

  • C++ 是一種靜態(tài)類型的、編譯式的、通用的、大小寫敏感的、不規(guī)則的編程語言,支持過程化編程、面向?qū)ο缶幊毯头盒途幊獭?/p>

  • .c 是c語言的源程序,.cpp是c++語言的源程序,這是兩種不同的語言,語法不同,c++兼容c語言的絕大部分語法特性。

c指針

指針是一個變量,其值為另一個變量的地址

指針(Pointer)是編程語言中的一個對象,利用地址,它的值直接指向(points to)存在電腦存儲器中另一個地方的值。

代碼片段

int var = 5;
int *address = &var;
cout << "var: " << var << endl;
cout << "&var: " << &var << endl;
cout << "address: " << address << endl;
cout << "*address: " << *address << endl;

打印log

var: 5
&var: 0x28ff28
address: 0x28ff28
*address: 5

定義

  • Java Native Interface,即 Java本地接口,它可以實現(xiàn) Java代碼 和C、C++代碼互調(diào) 。JNI 是屬于 Java 的,與 Android 無直接關(guān)系
  • Native Development Kit,是 Android的一個工具開發(fā)包 ,快速開發(fā)C、 C++的動態(tài)庫,NDK是屬于 Android 的,與Java并無直接關(guān)系

作用

  • 效率高,安全性高
  • 便于擴展移植

實踐

開發(fā)工具Android studio(目前使用2.3.3),同時需要下載ndk.
新建項目,勾選Include C++ support

勾選Include C++ support

下面選項可選


可選

添加ndk支持

添加ndk支持

到這里就可以成功的運行我們的項目,基本上我們的jni之hello word接近尾聲了??梢钥吹紿ello from C++

運行結(jié)果

拓展

熟悉android的小伙伴程序出了問題都習(xí)慣于斷點調(diào)試,log分析,當(dāng)然android studio非常強大,這一點該有的都有,非常方便

  • jni中l(wèi)og使用
    首先引入android/log.h,定義了一個常量LOG_TAG(可選) ,接下來就可以直接使用__android_log_print方法了
#include "android/log.h"
#define LOG_TAG  "honaf_jni"
 __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,"This is log");
  • jni調(diào)試
jni調(diào)試模式開啟

看看調(diào)試效果是不是也很棒啊,簡直如出一轍,簡潔明了,一目了然。

調(diào)試預(yù)覽

接下來應(yīng)該看什么了,我們做的so庫這么“牛逼”肯定要拿來給別人用啊,是吧!可以發(fā)現(xiàn)cmake目錄下已經(jīng)生成了各種型號的so庫。
so庫生成目錄

剛開始就提到過一個優(yōu)點就是便于擴展移植,但是使用的時候要注意
jni里面的方法都是根據(jù)java包名、類名、方法名來命名的
所以這里我就提取了一個java工具類HelloJniUtil專門用來加在so庫操作。同時由于包名的參與,我就新建了一個lib并且和新建jni之時的包名一致。由于之前的cpp代碼打成了so庫,所以該方法stringFromJNI顯示紅色很正常,莫慌。最后此lib或打成jar包便成達到我們移植功能,經(jīng)UseJniLib項目測試運行成功。
正確使用so庫

到此jni開發(fā)之旅邁出了重要的第一步。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容