今天來簡單的說說自己對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