AndroidStudio使用jni

溫馨提示:如果你的 Android Studio 版本在 2.2 以上 , 建議你用 cMake 的新姿勢進行 NDK 開發 : http://www.jianshu.com/p/e03028f826d7 我相信你會愛上 cMake 的;

本文demo下載地址:http://download.csdn.net/download/fisher_3/10118866
1. 環境搭建

俗話說 “工欲善其事,必先利其器” ;所以咱還是得先下載 ndk; 下載地址 :https://developer.android.com/ndk/downloads/index.html(需要翻牆,你懂得) 或者可以直接在 Android Studio 裏面下載,這就可以免去翻牆, File-->Project Structure

image1.png

如果你已經下載,直接選擇你 ndk 的位置; 如果沒有下載,在紅色框這個位置會有位置提示你下載,點擊下載就行; 添加 ndk 後你會在 local.properties 這個文件看到(路徑取決於你 ndk 的位置):

image2.png

莫慌,還差最後一步:

image3.png

在此處加上這句代碼:android.useDeprecatedNdk=true 好了,ndk 環境搭建完畢!

2. java 代碼與 c 代碼編寫

首先新建個 java 類

public class JniTest{
    static {
        System.loadLibrary("jary");
    }
    public native String getString();
}

然後重新編譯下你的 Project: Build-->Make Project(Ctrl+F9)
重新編譯之後就可以在對應的文件夾看到編譯後的 JniTest.class
C:\ASworkspace\MyJniTest\app\build\intermediates\classes\debug\jary\com\myjnitest


image4.png


下一步來看怎麼生成 .h 的文件
在 studio 打開 Terminal 命令行工具,打開步驟是 View-->Tool Windows-->Terminal (Alt+F12)

在命令行中先進入到工程的 main 目錄下
輸入命令:javah -d jni -classpath 自己編譯後的 class 文件的絕對路徑
例如:javah -d jni -classpath
C:\ASworkspace\MyJniTest\app\build\intermediates\classes\debug jary.com.myjnitest.JniTest
注意 debug 後面是有個空格的,如圖:


image5.png


命令執行後會在 main 目錄下(在哪個目錄下執行就會在哪個目錄下生成 .h 文件)自動生成 “jni” 文件夾,同時生成一個 .h 的文件


imag6.png

這個 .h 文件可不做修改 ;默認就行
現在我們來寫一個測試的 C 文件 jary.c 同 .h 文件一樣放到 jni 文件夾下,代碼如下:


image7.png

依賴剛纔生成的 .h 頭文件 ; 方法名與 .h 裏面方法名保持一致 ;
最後在 build.gradle defaultConfig 中添加如下代碼

 ndk {   
        moduleName "jary"         //生成的so名字    
        abiFilters "armeabi", "armeabi-v7a", "x86"  //輸出指定三種abi體系結構下的so庫。    
        stl "stlport_static"    //打開.c 的 debug , 下面第 4 點會講到
      }

到這裏,jni 調 C 就完成了,現在我們來測試一下,寫個 TextView 顯示一下調用的 C:

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView tvJni = (TextView) findViewById(R.id.tvJni);
    tvJni.setText(new JniTest().getString());
}
}

效果如下圖 :


image8.png
3. 生成 .so 以及調用

編譯後的 .so 文件如下圖路徑:


image9.png

根據這個路徑就可以找到指定輸出的三種體系結構下的 .so 文件,然後把 .so 文件複製出來,如下圖所示的放到 jniLibs 文件夾下面,如下圖:


image10.png

注意: 放到 jniLibs 文件夾下面,build.gradle 裏面什麼都可以不用配置

還有一種方式是將 .so 文件 放在 libs 文件夾下面,注意在 build.gradle 添加如下配置:


iamge11.png
4. 關於ndk開發在 .c 文件裏面的 debug

首先在 build.gradle 中添加如下代碼 :

android {
    ... ...
  defaultConfig {
      ... ...
     ndk {   
        moduleName "jary"         //生成的so名字    
        abiFilters "armeabi", "armeabi-v7a", "x86"  //輸出指定三種abi體系結構下的so庫。    
        stl "stlport_static"    //打開.c 的 debug (此句是打開的debug的關鍵)
     }
  }
  buildTypes {
     debug {    
            jniDebuggable true //此句不加在真機上 debug 不受影響,但是在虛擬機上不能 debug
     }
  }

配置後如下圖 ,會出現一個 app-native,選擇此項你就可以盡情的 debug 了:


image12.png

debug 如下圖:


image13.png





作者:jarylan
鏈接:http://www.jianshu.com/p/e7c2c63fa70e
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章