网站首页 > 技术文章 正文
直接开上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 += -llog
include $(BUILD_SHARED_LIBRARY) #
最后需要在java层加载.so文件,就可以直接运行编译了。
该文章属于:猴子游戏编程原创
转载请注明标题:如何androd动态注册编写计算器-猴子技术宅
转载请注明出处:https://www.ssfiction.com/andiordadb/41030.html
猜你喜欢
- 2024-10-27 NDK开发——FFmpeg视频解码 ffmpeg ndk
- 2024-10-27 Camera基本代码架构 camera calibrator
- 2024-10-27 android 功耗分析方法和优化(1) 功耗app
- 2024-10-27 Cocos Creator v2.3.2 发布了!全新 Launcher 效率飞起!
- 2024-10-27 高通平台OV8856 Camera的bring up总结
- 2024-10-27 高通平台移植GC2145 Camera驱动 高通驱动安装
- 2024-10-27 《坎公骑冠剑》光炮Android Mk.99技能与背景故事
- 2024-10-27 ubuntu移植libwebp到Android平台 ubuntu移植到arm
- 2024-10-27 步步为营,十分钟学会 Native JNI(附带彩蛋)
- 2024-10-27 高通Android 5.1系统Root方法 高通手机系统
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)