先了解一二
Windows 上的安裝c環(huán)境
- 下載 min-gw 安裝程,可自行百度mingw-get-setup.exe,安裝后配置環(huán)境變量如 C:\MinGw\bin
- 命令行安裝相應(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

下面選項可選

添加ndk支持

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

拓展
熟悉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)試

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

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

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

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