1. 程式人生 > >ndk爬坑之路1.0

ndk爬坑之路1.0

給定[.so庫檔案]和[so標頭檔案包名][方法名] 的前提下

環境:Android studio2.2.3 ndk cmake3.4.1 lldb
已知

  1. librate-lib.so檔案
  2. native方法名以及引數 返回值型別,如下:
package com.gxdloveyl.ndkdemo;

public class JniTool {
    static {
        System.loadLibrary("rate-lib");
    }
    public native static int getHeartRate();
}

新建工程,假設包名為com.vmove.jnitest
新建libs目錄到app module下,拷貝so檔案到其中
新建類檔案,將上面程式碼貼上進去,注意不要修改packagename,alt+enter選擇新建包放置。
包結構

此時getHeartRate()方法會變紅,提示找不到該本地方法,不用管他。
在MainActivity中呼叫本地方法,so庫中會返回一個隨機數,我們2s遞迴呼叫一次,顯示到Textview上

private TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Example of a call to a native method
tv = (TextView) findViewById(R.id.sample_text); getFromC(); } public void getFromC() { tv.postDelayed(new Runnable() { @Override public void run() { tv.setText(JniTool.getHeartRate()+"from jni"); getFromC(); } },2000
); }

此時是可以編譯通過的,但是安裝到手機上後會崩潰,報錯資訊:找不到lib庫檔案
那是因為我們沒有告訴gradle我們的so檔案在哪裡放著
在app下的build.gradle檔案中 android節點下新增

sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

好了,小工告成!測試一下
這裡寫圖片描述