源地址:https://www.ctvol.com/asreverse/41030.html
如何androd动态注册编写计算器
直接开上es开鲁,配置我们就不用多说了。
创建layout;在之后写debug时候回出现乱掉的情况,可以直接慢慢调试
在红圈中是layout基本设置,设置好,当然,我们不是做安卓开发,不需要做适配。只是知道原理就好。
java层代码:
申明变量->绑定方法->定义native方法->按钮绑定监听~~
package com.example.jsuanq;import javax.security.auth.PrivateCredentialPermission;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//首先初始化控件
init();//开始运算
yunsuan();
}//运算方法
private void yunsuan() {
// TODO Auto-generated method stub
//按钮绑定监听,在add.set导包import,之后控件绑定 final最终字段不会被修改
final OnClickListener cl = new OnClickListener() {@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.add:
//获取编辑框值float转string
one = Float.parseFloat(first.getText().toString());
two = Float.parseFloat(second.getText().toString());
//在调用函数后面+“”表示获取是字符
Toast.makeText(MainActivity.this, add(one,two)+"", 1).show();
break;
case R.id.sub:
//获取编辑框值float转string
one = Float.parseFloat(first.getText().toString());
two = Float.parseFloat(second.getText().toString());
Toast.makeText(MainActivity.this, sub(one,two)+"", 1).show();
break;
case R.id.mul:
//获取编辑框值float转string
one = Float.parseFloat(first.getText().toString());
two = Float.parseFloat(second.getText().toString());
Toast.makeText(MainActivity.this, mul(one,two)+"", 1).show();
break;
case R.id.div:
//获取编辑框值float转string
one = Float.parseFloat(first.getText().toString());
two = Float.parseFloat(second.getText().toString());
Toast.makeText(MainActivity.this, div(one,two)+"", 1).show();
break;
default:
break;
}
}
};
add.setOnClickListener(cl);
sub.setOnClickListener(cl);
mul.setOnClickListener(cl);
div.setOnClickListener(cl);
}private void init() {
// TODO Auto-generated method stub
//绑定相应ID
first = findViewById(R.id.editText1);
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方法,在so层;私有最小化
private native float add(float one,float two);
private native float sub(float one,float two);
private native float mul(float one,float two);
private native float div(float one,float two);
}
创建文件jni->创建.c文件~~
自定义函数;其中在ndk开发中,类型都需要加上j开头来规范。
sizeof(nativeMethod)/sizeof(nativeMethod[0],类的总大小/类元素大小
JNI_VERSION_1_4;jni版本号的写法
#include
//不需要自定义,直接使用jni导入
jfloat addc(JNIEnv* env,jobject obj,jfloat a,jfloat b){
return a+b;
}
jfloat subc(JNIEnv* env,jobject obj,jfloat a,jfloat b){
return a-b;
}
jfloat mulc(JNIEnv* env,jobject obj,jfloat a,jfloat b){
return a//绑定c层和java层
JNINativeMethod nativeMethod[]={
{"add","(FF)F",(void*)addc},
{"sub","(FF)F",(void*)subc},
{"mul","(FF)F",(void*)mulc},
{"div","(FF)F",(void*)divc}
};
//注册函数
jint rgisterNative(JNIEnv* env){//获取类
jclass pclazz = (*env)->FindClass(env, "com/example/jsuanq/MainActivity");
//注册
//(env)->RegisterNatives(env,pclass,nativeMethod,sizeof(nativeMethod)/sizeof(nativeMethod[0]));
//判断
if((env)->RegisterNatives(env, pclazz, nativeMethod, sizeof(nativeMethod)/sizeof(nativeMethod[0]))!=JNI_OK){
return JNI_ERR;//-1
}
return JNI_OK;//1
}
//使用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(rgisterNative(env)!=JNI_OK){
return JNI_ERR;
}
return JNI_VERSION_1_4;
}
在jni加入2个mk文件,其中android.mk中:
mk文件的编写可以参考:ndk开发中静态/动态生成so文件mk配置写法
下面是需要在adroid.mk中需要修改的参数;
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ssfiction #需要修改的地方LOCAL_SRC_FILES := ssfiction.c #需要修改的地方LOCAL_ARM_MODE := arm LOCAL_LDLIBS += -lloginclude $(BUILD_SHARED_LIBRARY) #
最后需要在java层加载.so文件,就可以直接运行编译了。