大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > Android技巧 > Android开发之NDK模拟登陆

Android开发之NDK模拟登陆(1)

关键词:AndroidNDK模拟登陆  阅读(1932) 赞(16)

[摘要]本文是对Android开发之NDK模拟登陆的讲解,对学习Android编程技术有所帮助,与大家分享。

由于Android应用程序大多使用Java编写,所有很容易通过反编译获取源代码,因此为了保持核心算法,逻辑的安全性,大多应用程序将该部分使用c或c++实现,例如:用户的登陆,底层采用c或c++代码编写。下面将演示简单的c语言验证用户名和密码正确性,实现登录。

1.创建Android应用程序

创建过程与一般android应用程序类似,添加2个EditText和1个Button,示例图如下

布局文件

 <LinearLayout 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:orientation="vertical" >
     <EditText 
         android:id="@+id/et1"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:hint="用户名"/>
      <EditText 
         android:id="@+id/et2"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:hint="密码"/>
      <Button
         android:id="@+id/bt1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:hint="登录"/>
 </LinearLayout>

2.添加Native方法

public native int login(String username,String password);

3.获取相应的头文件

D:\Android\ndk_login\src>javah com.forsta.login.MainActivity

得到com_forsta_login_MainActivity.h文件

com_forsta_login_MainActivity.h

 /* DO NOT EDIT THIS FILE - it is machine generated */
 #include <jni.h>
 /* Header for class com_forsta_login_MainActivity */
 
 #ifndef _Included_com_forsta_login_MainActivity
 #define _Included_com_forsta_login_MainActivity
 #ifdef __cplusplus
 extern "C" {
 #endif
 /*
  * Class:     com_forsta_login_MainActivity
  * Method:    login
  * Signature: (Ljava/lang/String;Ljava/lang/String;)I
  */
 JNIEXPORT jint JNICALL Java_com_forsta_login_MainActivity_login
   (JNIEnv *, jobject, jstring, jstring);
 
 #ifdef __cplusplus
 }
 #endif
 #endif

4.添加jni文件夹,Android.mk,login.c文件

login.c

 #include <stdio.h>
 #include <jni.h>
 #include <malloc.h>
 #include <string.h>
 #include "com_forsta_login_MainActivity.h"
 
 /**
  * 返回值 char* 这个代表char数组的首地址
  *  Jstring2CStr 把java中的jstring的类型转化成一个c语言中的char 字符串
  */
 char*   Jstring2CStr(JNIEnv*   env,   jstring   jstr)
 {
      char*   rtn   =   NULL;
      jclass   clsstring   =   (*env)->FindClass(env,"java/lang/String"); //String
      jstring   strencode   =   (*env)->NewStringUTF(env,"GB2312");  // 得到一个java字符串 "GB2312"
      jmethodID   mid   =   (*env)->GetMethodID(env,clsstring,   "getBytes",   "(Ljava/lang/String;)[B"); //[ String.getBytes("gb2312");
      jbyteArray   barr=   (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
      jsize   alen   =   (*env)->GetArrayLength(env,barr); // byte数组的长度
      jbyte*   ba   =   (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
      if(alen   >   0)
      {
       rtn   =   (char*)malloc(alen+1);         //"\0"
       memcpy(rtn,ba,alen);
       rtn[alen]=0;
      }
      (*env)->ReleaseByteArrayElements(env,barr,ba,0);  //
      return rtn;
 }
 
 //登录判断逻辑
 int login(char*username,char*password)
 {
     char*user="forsta";
     char*pwd="123456";
     int i=0,j=0;
     if(strcmp(user,username)!=0 ||strcmp(password,pwd)!=0){
         return 404;
     }
     return 200;
 }
 
 JNIEXPORT jint JNICALL Java_com_forsta_login_MainActivity_login
   (JNIEnv *env, jobject obj, jstring username, jstring pwd){
     char*name=Jstring2CStr(env,username);
     char*password=Jstring2CStr(env,pwd);
     return login(name,password);
 
 }
«上一页12下一页»


相关评论