如何androd动态注册编写计算器

 源地址:https://www.ctvol.com/asreverse/41030.html

如何androd动态注册编写计算器

直接开上es开鲁,配置我们就不用多说了。

创建layout;在之后写debug时候回出现乱掉的情况,可以直接慢慢调试

layout

在红圈中是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文件,就可以直接运行编译了。

安卓计算机运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

细胞世界:1.内膜系统(物流网络)与跨膜运输(交通方式)

内膜系统就像一个高度组织化、效率卓越的现代化物流网络,各组成部分协同工作,确保细胞内外的物质转运和处理高效、准确进行。每个部分都承担着不同但相互关联的角色,通过这样的内部物流系统,细胞能够维持其生命活动,响…

网络广播系统是什么?网络广播的作用及应用

网络广播系统是什么?网络广播的作用及应用 商场广播的目的:提醒人员有序、监控配合点对点呼叫、物品遗失广播、背景音乐防噪、紧急情况呼叫等等,各个场景有各个场景的需求模式,广播系统的建设重点在于突发情况的应对,国家已经把广…

清明美食制作|“心灵护航,增能培力”残疾人职业能力提升培养

为提高残疾人的动手能力,提升个人的自身素质和自主就业创业能力,弘扬中华民族传统文化,临近清明之际,淳安县从益舍社会工作服务中心于浪川乡展开了以“品尝春天味道 制作清明粿 清明美食制作”为主题的清明节活动。 【清明粿制作】…

0点起C语言

用sizeof()来查看在你的平台上到底占用多少你多少字节的内存。 Int x sizeof(int); Int xsizeof(shrt int); Int xsizeof(long); Int xsizeof(long double); 等等。 http://www.enet.com.cn/article/2012/0822/A20120822153730_2.shtml #—是个预处理的标志,表示对文…

PCIe总线-存储器域和PCIe总线域访问流程(二)

1.概述 PCIe总线的最大特点是像CPU访问DDR一样,可以直接使用地址访问PCIe设备(桥),但不同的是DDR和CPU同属于存储器域,而CPU和PCIe设备属于两个不同的域,PCIe设备(桥)的地址空间属于…

【MATLAB第104期】基于MATLAB的xgboost的敏感性分析/特征值排序计算(针对多输入单输出回归预测模型)

【MATLAB第104期】基于MATLAB的xgboost的敏感性分析/特征值排序计算(针对多输入单输出回归预测模型) 因matlab的xgboost训练模型不含敏感性分析算法,本文通过使用single算法,即单特征因素对输出影响进行分析,得出不同…

【教学类-52-01】20240411动物数独(4宫格)宫格图

作品展示 背景需求: 一、下载图片 PS修图(图片长宽一样,把动物图片上下拉长) 二、数独结构分析: 1、这是一个四宫格的数独题, 2、将1234换成了四种小动物图片。 于是我去找到原来做过的一个代码&#xf…

秒杀优化-异步秒杀思路

6、秒杀优化 6.1 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足…

【c语言】atoi函数---使用和模拟实现(详解)

atoi函数---使用和模拟实现 atoi函数在Cplusplus中的定义 atoi函数的使用 #include <stdio.h> #include <stdlib.h>int main() {char arr[20] "4831213";int ret 0;ret atoi(arr);printf("arr:%s\n", arr);printf("ret:%d\n", re…

openstack之neutron介绍

核心组件 neutron-server&#xff1a;提供API接口&#xff0c;把对应的api请求传给plugin进&#xff1b; neutron-plugin&#xff1a;管理逻辑网络状态&#xff0c;调用agent&#xff1b; neutron-agent&#xff1a;在provider network上创建网络对象&#xff1b; neutron-…

EaticSearch学习

ES学习目标 1、全文检索 2、ES介绍 2.1 安装&#xff08;docker&#xff09; docker pull elasticsearch:7.14.0 docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" elasticsearch:7.14.0初步检索 1、_cat GET /_cat/nodes&#xff1a;查看所…

【二分算法】

17. 二分查找&#xff08;easy&#xff09; 算法流程&#xff1a; 算法代码&#xff1a; int search(int* nums, int numsSize, int target) {// 初始化 left 与 right 指针int left 0, right numsSize - 1;// 由于两个指针相交时&#xff0c;当前元素还未判断&#xff0c;因…

idea项目编译时报错:GC overhead limit exceeded

问题描述 今天idea构建一个新的项目时报错&#xff1a;GC overhead limit exceeded&#xff0c;错误是发生在编译阶段&#xff0c;而不是运行阶段。 ava: GC overhead limit exceeded java.lang.OutOfMemoryError: GC overhead limit exceededat com.sun.tools.javac.resources…

OOCT WPF_D3D项目报错无法加载依赖项

运行示例项目报错缺少dll&#xff0c;发现运用了这个大老李&#xff0c;通过添加PATH路径也无法解决&#xff0c;看到debug文件夹下面没有其他的依赖项。 通过depneds工具可以看到 OCCTProxy_D3D.dll 缺少依赖项&#xff0c;图中的缺项都是OCCT生成的模块dll所以讲这些dll从..…

编程新手必看,python中循环语句学习(14)

介绍&#xff1a; Python3中的循环语句主要有两种&#xff1a;for循环和while循环。 for循环&#xff1a;用于遍历序列&#xff08;如列表、元组、字符串等&#xff09;中的元素&#xff0c;执行相应的代码块。在每次循环中&#xff0c;序列中的一个元素被赋值给一个变量&#…

第四百五十六回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 使用方法 3. 内容总结 我们在上一章回中介绍了"overlay_tooltip用法"相关的内容&#xff0c;本章回中将介绍onBoarding包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的onBo…

2024年 Mathorcup高校数学建模竞赛(C题)| 物流网络分拣中心 | 线性规划,流网络,多目标规划联合,小鹿学长带队指引全代码文章与思路

我是鹿鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮200人完成了建模与思路的构建的处理了&#xff5e; 本篇文章是鹿鹿学长经过深度思考&#xff0c;独辟蹊径&#xff0c;通过多目标规划解决物流网络分拣中心问题。结合线性规划&#xff0c;流网络等多元算…

数据结构-----枚举、泛型进阶(通配符?)

文章目录 枚举1 背景及定义2 使用3 枚举优点缺点4 枚举和反射4.1 枚举是否可以通过反射&#xff0c;拿到实例对象呢&#xff1f; 5 总结 泛型进阶1 通配符 ?1.1 通配符解决什么问题1.2 通配符上界1.3 通配符下界 枚举 1 背景及定义 枚举是在JDK1.5以后引入的。主要用途是&am…

CMD命令窗口提示文字乱码

我下面说的是日文版系统&#xff0c;中文版会有差异。 一般情况下是 Shiftjis 通常我是用sakura editor来写bat&#xff0c;但是运行后会在cmd窗口出现乱码 test.bat set HENSU这是一个变数 echo %HENSU% pause 执行后出现乱码 原因是不做设置时&#xff0c;command prom…

3.2.k8s搭建-kubeadm

目录 一、虚拟机准备 二、所有节点环境准备 1.所有节点做hosts解析 2.所有节点重新命名 3.所有节点安装docker 4.所有节点为docker做linux内核转发 5.所有节点配置docker 6.所有节点关闭swap分区 7.所有节点验证网卡硬件编号是否冲突 8.所有节点配置允许iptables桥接…