NDK的基础教程 五 登录判断
来源:互联网 发布:windows系统备份还原 编辑:程序博客网 时间:2024/06/11 18:52
我这次写的NDK代码是判断账号密码是否都大于7位数,密码是否是由数字和字母组成。
我这里环境配置就不说了,不清楚的朋友请看下面链接
NDK的基础教程 一 最简单的NDK使用 - z979451341的博客 - CSDN博客
http://blog.csdn.net/z979451341/article/details/76691515
1 。首先贴代码,因为在CSDN下资源都要积分,github上传太麻烦我就直接贴代码了
public class MainActivity extends ActionBarActivity { private TextView tv_id; private TextView tv_passw; private EditText et_id; private EditText et_passw; private Button bt_login; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_id = (TextView)findViewById(R.id.tv_id); tv_passw = (TextView)findViewById(R.id.tv_passw); et_id = (EditText)findViewById(R.id.et_id); et_passw = (EditText)findViewById(R.id.et_passw); bt_login = (Button)findViewById(R.id.bt_login); bt_login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int status = JNIDynamicUtils.getSumFromJNI(et_id.getText().toString(),et_passw.getText().toString()); if(status == 0) Toast.makeText(MainActivity.this,"发生不知名的错误!" ,Toast.LENGTH_SHORT).show(); else if(status==1) Toast.makeText(MainActivity.this,"登录成功!" ,Toast.LENGTH_SHORT).show(); else if(status == 2) Toast.makeText(MainActivity.this,"登录失败,账号和密码都必须在7位以上! " ,Toast.LENGTH_SHORT).show(); else if(status == 3) Toast.makeText(MainActivity.this,"登录失败,密码需要数字和字母结合! " ,Toast.LENGTH_SHORT).show(); } }); }}
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="io.github.yanbober.ndkapplication.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="账号:" android:id="@+id/tv_id"/> <EditText android:layout_width="250dp" android:layout_height="wrap_content" android:id="@+id/et_id" android:layout_toRightOf="@+id/tv_id" android:layout_alignTop="@+id/tv_id"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="密码:" android:id="@+id/tv_passw" android:layout_alignLeft="@+id/tv_id" android:layout_marginTop="50dp"/> <EditText android:layout_width="250dp" android:layout_height="wrap_content" android:id="@+id/et_passw" android:layout_toRightOf="@+id/tv_passw" android:layout_alignTop="@+id/tv_passw"/> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录" android:id="@+id/bt_login" android:layout_alignLeft="@+id/tv_id" android:layout_marginTop="100dp"/></RelativeLayout>
public class JNIDynamicUtils { public static native int getSumFromJNI(String i1, String i2); static { System.loadLibrary("myNativeLib"); }}
#include <stdio.h>#include <jni.h>#include <stdlib.h>#include <android/log.h>#ifndef LOG_TAG#define LOG_TAG"ANDROID_LAB"#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)#endifjint calcSum(JNIEnv *env, jclass clazz, jstring i1, jstring i2) { //将java传入的name转换为本地utf的char* const char* p1 = env->GetStringUTFChars( i1, NULL); const char* p2 = env->GetStringUTFChars( i2, NULL); //声明局部量 char k1[126] = {0}; memset(k1, 0, sizeof(k1)); char k2[126] = {0}; memset(k2, 0, sizeof(k2)); jint status = 0; if (NULL != p1 && NULL != p2) { strcpy(k1, p1); strcpy(k2, p2); jint j = 0; for(jint i = 0 ;i< strlen(k2) ;i++){ if(k2[i] >= 'a') j = 1; } if(j == 0 ) return 3; if(strlen(k1) > 6 && strlen(k2) > 6){ //java的name对象不需要再使用,通知虚拟机回收name env->ReleaseStringUTFChars(i1, p1); env->ReleaseStringUTFChars(i2, p2); return 1; } else{ env->ReleaseStringUTFChars(i1, p1); env->ReleaseStringUTFChars(i2, p2); return 2; } } return 0;}/** * JNINativeMethod由三部分组成: * (1)Java中的函数名; * (2)函数签名,格式为(输入参数类型)返回值类型; * ()Ljava/lang/String; (II)表示需要传两个int型参数,Ljava/lang/String;表示返回String,在对象类名(包括包名,‘/’间隔)前面加L,分号结尾 * (3)native函数名 */static JNINativeMethod gMethods[] = { {"getSumFromJNI", "(Ljava/lang/String;Ljava/lang/String;)I", (void *)calcSum }};//System.loadLibrary过程中会自动调用JNI_OnLoad,在此进行动态注册JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) { JNIEnv *env = NULL; jint result = JNI_FALSE; //获取env指针 if (jvm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) { return result; } if (env == NULL) { return result; } //获取类引用 jclass clazz = env->FindClass("io/github/yanbober/ndkapplication/JNIDynamicUtils"); if (clazz == NULL) { return result; } //注册方法 if (env->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < 0) { return result; } //成功 result = JNI_VERSION_1_6; return result;}
我们可以看出这是动态注册,看这段代码
static JNINativeMethod gMethods[] = { {“getSumFromJNI”, “(Ljava/lang/String;Ljava/lang/String;)I”, (void *)calcSum }};
其中”(Ljava/lang/String;Ljava/lang/String;)I”就指的是函数的参数和返回值的类型签名,这个我们必须知道如何去写
类型签名
JNI使用Java虚拟机的类型签名表述。下表列出了这些类型签名:
类型签名 Java 类型
Z boolean
B byte
C char
S short
I int
J long
F float
D double
L fully-qualified-class ; 全限定的类
[ type type[]
( arg-types ) ret-type 方法类型
然后这个表我是直接借用网上的,我个人补充一个String的类型签名:“Ljava/lang/String;” ,这个冒号是存在的不要忘了
然后就是基本类型的写法,这个简单基本就是加个j
基本类型
基本类型和本地等效类型表:
Java类型 本地类型 说明
boolean jboolean 无符号,8位
byte jbyte 无符号,8位
char jchar 无符号,16位
short jshort 有符号,16位
int jint 有符号,32位
long jlong 有符号,64位
float jfloat 32位
double jdouble
void void N/A
好了这就完了,我下一次去试着调用一些公共API来做例子。
- NDK的基础教程 五 登录判断
- NDK的基础教程 三 传递数组
- NDK的基础教程 四 动态注册
- NDK的基础教程 一 最简单的NDK使用
- 基于C#的接口基础教程之五
- 基于C#的接口基础教程之五
- 基于C#的接口基础教程之五
- 基于C#的接口基础教程之五
- NDK的基础教程 六 so库的创建和使用
- 判断登录的状态
- NDK的基础教程 二 c语言回调java语言
- 我的NDK学习开发笔记(五)
- linux基础教程--安装Android NDK
- 关于登录超时的判断
- 简单的登录验证判断
- PHP简单的登录判断
- 登录时session的判断
- 基础教程五(缓冲输入)
- Java技术----Java泛型详解
- 开源协议
- [转]常用电平标准(TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232)
- Android开发的四大组件
- 设计模式笔记
- NDK的基础教程 五 登录判断
- hdoj 1089
- JEESZ-SSO解决方案
- springmvc前后端日期类型的转换
- UVA 1374 Power Calculus
- jeecg如何在list页面中将img的url转化成图片展示
- Java 细说多线程之内存可见性
- 什么是AR增强现实技术
- Qt源码学习之路(1) QObject类