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目录:
可参考官方教程: 点击打开链接