今天来简单的说说自己对JNI的理解
一、创建工程(这一步大家都会吧?)
二、配置相关参数
1、引入ndk(NDK官网下载地址,需要翻墙才能下载),选中你的项目按F4,
点击ok之后,查看一下local.properties文件,如果有下图红色圈圈中的那行代码,证明配置成功
2、在gradle.properties文件最后,加入这行代码 android.useDeprecatedNdk=true
三、引入c文件:Project模式下,在main文件夹下面创建jni的文件夹,将相关的c文件放入其中,如图
三个文件的内容分别是:
Operate.h
#include <string.h>
#include <jni.h>
int add(int x, int y);
Operate.c
#include "Operate.h"
/**
* C 实现的 加法
*/
int add(int x, int y) {
return x+y;
}
hello-jni.c
#include <string.h>
#include <jni.h>
#include "Operate.h"
jint Java_com_aaron_jnicdemo_MainActivity_add( JNIEnv* env,
jobject thiz,
jint x,jint y)
{
return add(x,y);
}
四、在gralde里面配置如下代码(详细解释这里不说了,百度一下吧)
五、回到Android代码里面,首先上一个简单的布局
然后直接上主要的代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText etX = (EditText) findViewById(R.id.et_x);
final EditText etY = (EditText) findViewById(R.id.et_y);
final TextView textView = (TextView) findViewById(R.id.tv);
Button button = (Button) findViewById(R.id.btn);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String strX = etX.getText().toString().trim();
String strY = etY.getText().toString().trim();
if (TextUtils.isEmpty(strX) || TextUtils.isEmpty(strY)) {
Toast.makeText(MainActivity.this, "输入不能为空", Toast.LENGTH_SHORT).show();
return;
}
int intX = Integer.parseInt(strX);
int intY = Integer.parseInt(strY);
int result = add(intX, intY);
textView.setText(String.valueOf(result));
}
});
}
public native int add(int x, int y);
static {
System.loadLibrary("hello-jni");
}
}
运行 ,ok!
**注意事项:
1、主代码里面引入c的时候,名字一定不能出错
System.loadLibrary("hello-jni");
2、c里面的方法名称,必须和引用类的目录对应
Java_com_aaron_jnicdemo_MainActivity_add
第一部分必须是Java,第一个字母大写;
第二个部分,告诉你只能在com/aaron/jnicdemo/MainActivity里面调用;
第三个部分,为方法名
附上源码:https://github.com/yangbin-aaron/JNI_C_Demo