初識JNI---Android

JNI(java native interface)java本地接口,可以在java中調用本地方法(包含但不僅限於C/C++).

使用jni的優點,本地方法執行速度快,重要內容放在.so中不易被反編譯。

在Android Studio中配置NDK(native development kit)Android中的jni。

打開setting,按照下圖找到並勾選CMAKE, LLDB, NDK.點擊apply


配置好ndk後,新建一個項目,勾選Include C++ support


生成的結構


可以到多了CMakeLists.txt 和 native-lib.cpp.

看一下MainActivity

package com.example.uwei.testjni;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Example of a call to a native method
        TextView tv = (TextView) findViewById(R.id.sample_text);
        tv.setText(stringFromJNI());

    }

    /**
     * A native method that is implemented by the 'native-lib' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();
}

可以看到,聲明瞭一個本地方法 stringFromJNI,前面需要native修飾。

還有一個System.loadLibrary(),是加載這個生成的.so文件,稍後會看到。

來看看native-lib.cpp: 可以看到在這個裏面實現了上面 MainActivity類中的 stringFromJNI方法,注意方法必須按照規則來寫。


再來看看那個 CMakeLists.txt 。


所以現在知道爲什麼MainActivity中有 System.loadLibrary("native-lib")了。

ok,現在直接運行就能夠顯示出調用了本地的c方法。



剛纔那個native-lib.cpp文件是自動生成的,現在我們自己寫一個.cpp文件試試,然後再來調用。

就寫個myLib.cpp好了, 步驟如下:



創建完myLib.cpp後,他現在是空的,不管他,先在CMakeLists.txt裏面聲明這個本地庫,稍後來實現裏面的方法。

注意myLib爲名字,myLib.cpp爲你的C文件。


然後在 MainActivity中添加一個本地方法,叫做intFromJNI()好了


然後在myLib.cpp裏面實現這個方法:


最後,在MainActivity裏面要加載這個.so文件,使用System.loadLibrary("myLib").


ok,一切就緒了,先在來編譯一下。make module.然後運行。intFromJNI會返回整數100預測結果  toast出 100 + "".



嗯,先在使用Android中的ndk已經入門了。

生成的.so庫的文件名是 lib + “你在CMakeLists.txt裏命的名“.so   

那麼它在哪裏呢,切換成 project目錄:



可參考官方教程: 點擊打開鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章