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来做例子。

原创粉丝点击