初识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目录:



可参考官方教程: 点击打开链接

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