1.创建布局文件:
2.创建.java文件:
package com.tencent.console;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
//定义控件变量
private EditText first;
private EditText second;
private Button add;
private Button sub;
private Button mul;
private Button div;
private float one;
private float two;
static {
System.loadLibrary("cons");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
inIt();
//获取空间值
// one =Float.parseFloat(0 + first.getText().toString());
// two =Float.parseFloat(0 + second.getText().toString());
con();
}
//设置监听
private void con() {
View.OnClickListener ol = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.add:
one =Float.parseFloat(0 + first.getText().toString());
two =Float.parseFloat(0 + second.getText().toString());
Toast.makeText(MainActivity.this, add(one, two)+"", Toast.LENGTH_LONG).show();
break;
case R.id.sub:
one =Float.parseFloat(0 + first.getText().toString());
two =Float.parseFloat(0 + second.getText().toString());
Toast.makeText(MainActivity.this, sub(one, two)+"", Toast.LENGTH_LONG).show();
break;
case R.id.mul:
one =Float.parseFloat(0 + first.getText().toString());
two =Float.parseFloat(0 + second.getText().toString());
Toast.makeText(MainActivity.this, mul(one, two)+"", Toast.LENGTH_LONG).show();
break;
case R.id.div:
one =Float.parseFloat(0 + first.getText().toString());
two =Float.parseFloat(0 + second.getText().toString());
Toast.makeText(MainActivity.this, div(one, two)+"", Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
};
add.setOnClickListener(ol);
sub.setOnClickListener(ol);
mul.setOnClickListener(ol);
div.setOnClickListener(ol);
}
//绑定控件
private void inIt() {
first = findViewById(R.id.editText);
second = findViewById(R.id.editText2);
add = findViewById(R.id.add);
sub = findViewById(R.id.sub);
mul = findViewById(R.id.mul);
div = findViewById(R.id.div);
}
//定义native层的方法
public native float add(float one, float two);
public native float sub(float one, float two);
public native float mul(float one, float two);
public native float div(float one, float two);
}
3.创建xxx.c文件
#include<jni.h>
jfloat add(JNIEnv* env, jobject obj, jfloat a, jfloat b){
return a + b;
}
jfloat sub(JNIEnv* env, jobject obj, jfloat a, jfloat b){
return a - b;
}
jfloat mul(JNIEnv* env, jobject obj, jfloat a, jfloat b){
return a * b;
}
jfloat div(JNIEnv* env, jobject obj, jfloat a, jfloat b){
return a / b;
}
//用户绑定java方法和c方法的关系
//结构体的第一个参数name是java方法名;
//第二参数是signature 用户描述方法的参数与返回值;
//第三个参数第fnPtrs 是函数的指针,指向jni函数
//其中,第二参数signature 使用字符串记录方法的参数和返回值,具体格式形式"()V", "(II)V"其中分为两个部分,括号内表示参数,括号右侧表示的是返回值
JNINativeMethod nativeMethod[] = {
{"add", "(FF)F", (void*)add},
{"sub", "(FF)F", (void*)sub},
{"mul", "(FF)F", (void*)mul},
{"div", "(FF)F", (void*)div}
};
//注册相应的类及方法
jint registNativeMethod(JNIEnv* env){
//获取java native方法对应的类
jclass clazz = (*env) -> FindClass(env, "com/tencent/console/MainActivity");
//注册java层native的方法
if((*env)->RegisterNatives(env, clazz, nativeMethod, sizeof(nativeMethod)/sizeof(nativeMethod[0])) != JNI_OK){
return JNI_ERR;
};
return JNI_OK;
}
//实现JNI_OnLoad动态注册方法
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved){
JNIEnv* env;
if((*vm)->GetEnv(vm, (void**) & env, JNI_VERSION_1_4) != JNI_OK){
return JNI_ERR;
}
if(registNativeMethod(env) != JNI_OK){
return JNI_ERR;
}
return JNI_VERSION_1_4;//必须放回这个值
}
注意:
JNI_OnLoad方法自动调用
4.创建Android.mk和Application.mk(内容和静态创建样报错生成.so文件)