安卓NDK开发案列一:字符串的加密和解密

前言:通过此案例来加深一下我们对JNI字符串的处理,当然字符串的操作用java也可以完美解决,废话不多说开始今天的撸代码!

--------分割线--------

ok,我们来看一下效果图:


实现思路:

1.从edittext获取字符串。

2.将获得的字符串传递给jni

3.在jni进行字符串的加密,然后返回。

4.在jni进行字符串的解密,然后返回。

------------分割线-------

java代码:

MainActivity.java:

package com.fly.demo5;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    private EditText et;
    private JNI jni;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et = (EditText) findViewById(R.id.et);
        jni = new JNI();
    }

    public void encode(View view) {
        //获取edittext的文字
        String word = et.getText().toString();
        //传递c加密处理
        word = jni.encodeInC(word);
        //把处理后的结果显示到edittext上
        et.setText(word);
    }

    public void decode(View view) {
        //获取edittext的文字
        String word = et.getText().toString();
        //传递c加密处理
        word = jni.decodeInC(word);
        //把处理后的结果显示到edittext上
        et.setText(word);
    }
}
JNI.java:
package com.fly.demo5;

/**
 * Created by Fly on 2017/7/6.
 */

public class JNI {
    static {
        System.loadLibrary("native-lib");
    }
    public native String encodeInC(String word);

    public native String decodeInC(String word);
}
简单的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.fly.demo5.MainActivity">

    <EditText
        android:id="@+id/et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="encode"
            android:text="加密" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:onClick="decode"
            android:text="解密" />
    </LinearLayout>


</LinearLayout>
C代码:
//
// Created by Fly on 2017/7/6.
//
#include <jni.h>
#include <stdlib.h>
#include <stdio.h>

/**
 * 把一个jstring转换成一个c语言的char* 类型.
 */
char *_JString2CStr(JNIEnv *env, jstring jstr) {
    char *rtn = NULL;
    jclass clsstring = (*env)->FindClass(env, "java/lang/String");
    jstring strencode = (*env)->NewStringUTF(env, "GB2312");
    jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B");
    jbyteArray barr = (jbyteArray) (*env)->CallObjectMethod(env, jstr, mid,
                                                            strencode); // String .getByte("GB2312");
    jsize alen = (*env)->GetArrayLength(env, barr);
    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;
}

JNIEXPORT jstring JNICALL Java_com_fly_demo5_JNI_encodeInC
        (JNIEnv *env, jobject clazz, jstring jstr) {
//把jstring类型字符串转化成 c能够处理的char* 类型
    char *cstr = _JString2CStr(env, jstr);
    int length = strlen(cstr);
    int i;
    for (i = 0; i < length; i++) {
        *(cstr + i) += 2;
    }
    return (*env)->NewStringUTF(env, cstr);
}

/*
 * Class:     com_fly_demo5_JNI
 * Method:    decodeInC
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_fly_demo5_JNI_decodeInC
        (JNIEnv *env, jobject clazz, jstring jstr) {
    char *cstr = _JString2CStr(env, jstr);
    int length = strlen(cstr);
    int i;
    for (i = 0; i < length; i++) {
        *(cstr + i) -= 2;
    }
    return (*env)->NewStringUTF(env, cstr);
}

--------完--------

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等待着冬天的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值