如何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.内膜系统(物流网络)与跨膜运输(交通方式)

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

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

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

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

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

详解QUuid类的使用

QUuid 是 Qt 框架中的一个类,用于生成、操作和表示全局唯一标识符(Universally Unique Identifier, UUID)。UUID 是一种标准格式的 128 位数字,通常用 32 个十六进制数表示,并且包含分隔符和特定的版本信息&#xff0c…

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…

CAP定理和BASE定理

CAP定理 CAP理论为:一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。 —致性(Consistency) 一致性指"all n…

秒杀优化-异步秒杀思路

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;查看所…

oracle记录

文章目录 表操作查询表占用内存大小 表操作 查询表占用内存大小 select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_nameupper(表名);

【二分算法】

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

C++traits

traits C的标准库提供了<type_traits>,它定义了一些编译时基于模板类的接口用于查询、修改类型的特征&#xff1a;输入的时类型&#xff0c;输出与该类型相关的属性 通过type_traits技术编译器可以回答一系列问题&#xff1a;它是否为数值类型&#xff1f;是否为函数对象…

AI工程师Devin的诞生,开启软件开发新纪元

Devin的诞生 最近&#xff0c;初创公司Cognition推出了一款名为Devin的全球首位AI工程师。尽管成立时间不到两个月&#xff0c;但公司拥有十名天才工程师&#xff0c;引起了行业内程序员的高度关注。研发团队在社交媒体上发布了一段演示视频&#xff0c;展示Devin的能力。 用户…

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…

【ZZULIOJ】1061: 顺序输出各位数字(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 输入一个不大于10的9次方的正整数&#xff0c;从高位开始逐位分割并输出各位数字。 输入 输入一个正整数n,n是int型数据 输出 依次输出各位上的数字&#xff0c;每一个数字后面有一个空格…

python连接mysql数据库通用类

在 Python 中创建一个通用的数据库连接类&#xff0c;用于连接 MySQL 数据库并执行常见的数据库操作&#xff0c;可以提高代码的复用性和可维护性。下面是一个示例&#xff1a; python import mysql.connector class MySQLDatabase: def __init__(self, host, user, pass…