我們來看下jni的定義(來自百度):JNI是java Native Interface 的縮寫,它提供了若干個的Api實(shí)現(xiàn)了java和其他語言的通信(主要是C和C++);
android開發(fā)用的語言是java,但是android底層實(shí)現(xiàn)是c語言實(shí)現(xiàn)的linux內(nèi)核,一些驅(qū)動等都是c代碼,我們用java開發(fā)功能時要對硬件進(jìn)行調(diào)用控制,c和java不能互相調(diào)用,這時就得用一個中間件來完成,jni就是c與java兩個語言互調(diào)的中間件。
下面我們來看一下android studio中來實(shí)現(xiàn)jni操作;首先我們假設(shè)android studio 已經(jīng)配置好而且都會用android studio;下面來配置NDK:1、下載NDK 網(wǎng)址:https://developer.android.com/ndk/guides/index.html? google 官方例子:https://github.com/googlesamples/android-ndk/tree/master

google 已經(jīng)給我們添加好的NDK下載,我們可以在sdkmanager中進(jìn)行下載,



把NDK這個勾上點(diǎn)擊應(yīng)用android studio會自動幫我們下載,下載好之后,我們在這里配置一下File->other setting->default project structure進(jìn)行配置。
上面這幾部完成我們就可以來完成jni開發(fā);首先我們來進(jìn)行一個簡單的測試:
1、我們要實(shí)現(xiàn)什么功能:在textView中顯示從jni獲得的字符串;
2、我們要創(chuàng)建一個類名叫:HelloJni里面定義一個方法叫g(shù)etJniString(),這里報錯,不要管它;

3、通過javah獲取這個類及方法對應(yīng)的c代碼中的.h文件(在android studio中有個teminal這個命令行工具并直接定位到了所在的工程app下):
1)我們下進(jìn)行編譯一下,報錯不要管(怎么先編譯啊,這個其實(shí)可以不用,這個是因?yàn)樵贘DK早期的版本中需要在class文件進(jìn)行生成.h文件這是我們就需要先編譯生成.class文件,這個build->made project 在app->build->intermediates->classes下中找到對應(yīng)的.class文件,有的話進(jìn)行下邊額操作),其實(shí)我們可以直接在java文件下生成.h文件(可能會出錯,JDK版本問題)

2)在terminal中來生成.h文件,沒有進(jìn)入到classes目錄?????,好吧我們直接找工程進(jìn)入對應(yīng)的目錄,看來只能相信自己了,在對應(yīng)的debug目錄下打開命令行shift+鼠標(biāo)右擊,選擇‘在此處打開命令行窗口’輸入javah查看一下有無當(dāng)前命令之后輸入對應(yīng)的命令 : javah -jni com.oath.demo.HelloJni 這個是在debug文件夾下對應(yīng)的你的文件路徑(HelloJni)用.隔開也就是包路徑,這時回車在debug文件夾下生成.h文件。




3)我們在app的main文件下創(chuàng)建jni文件夾,把生成的.h文件方進(jìn)去,這個.h只是一個聲明沒有具體實(shí)現(xiàn),下面我們在床架一個.c文件來實(shí)現(xiàn)這個方法;同樣在jni文件夾下創(chuàng)建HelloJni.c(可以不叫HelloJni,其他的也行這個沒有限制)文件,接下來我們來寫HelloJni.c的內(nèi)容如圖:


4)在app下的build.pradle下聲明NDK,在mainActivity中調(diào)用一下getJniString();先加載jni庫文件,這個myjni是隨便起的;


5)測試如圖
