JNI学习笔记(小案例开发)

本文介绍了一个简单的 Android 应用实例,该应用使用 JNI 技术实现了字符串的加密与解密功能。通过调用本地 C/C++ 代码完成字符串逆置操作,展示了 Android 中 Java 与本地代码交互的基本流程。

MainActivity

package com.study.strtool;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {

    static {
        System.loadLibrary("strtool-jni");
    }

    EditText et_str;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et_str = (EditText) findViewById(R.id.et_str);
    }

    public native String strEncode(String jstr);
    public native String strDecode(String jstr);

    public void encode(View view){
        String jstr = et_str.getText().toString().trim();
        String en_jstr = strEncode(jstr);

        et_str.setText(en_jstr);
    }
    public void decode(View view){
        String jstr = et_str.getText().toString().trim();
        String de_jstr = strDecode(jstr);

        et_str.setText(de_jstr);
    }

}

layout

<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"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/et_str"
        android:hint="输入加密或解密字符串"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="encode"
        android:text="加密字符串" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="decode"
        android:text="解密字符串" />

</LinearLayout>

com_study_strtool_MainActivity.h

#include <jni.h>

#ifndef _Included_com_study_strtool_MainActivity
#define _Included_com_study_strtool_MainActivity
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jstring JNICALL Java_com_study_strtool_MainActivity_strEncode
  (JNIEnv *, jobject, jstring);


JNIEXPORT jstring JNICALL Java_com_study_strtool_MainActivity_strDecode
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

strtool-jni.c

#include <jni.h>
#include <stdio.h>//NULL
#include <stdlib.h>//malloc()/free()
char *strrev(char *s){
    char *p = s;
    char *q = s;
    char temp;

    while(*q != '\0')
        q++;

    while(p < q){
        temp = *p;
        *p = *q;
        *q = temp;
        p++;
        q--;
    }

    return s;
}


JNIEXPORT jstring JNICALL Java_com_itheima_strtool_MainActivity_strEncode(
        JNIEnv *env, jobject obj, jstring jstr) {

    char *cstr = NULL;
    jsize len = 0;
    jstring new_jstr;
    len = (*env)->GetStringLength(env, jstr);
    cstr = (char *) malloc(len + 1);//'\0'


    (*env)->GetStringUTFRegion(env, jstr, 0, len, cstr);

    //逆置字符串     abcd'\0'  --  dcba'\0'
    cstr = strrev(cstr);

    new_jstr = (*env)->NewStringUTF(env, cstr);

    free(cstr);

    return new_jstr;
}


JNIEXPORT jstring JNICALL Java_com_itheima_strtool_MainActivity_strDecode(
        JNIEnv *env, jobject obj, jstring jstr) {

    char *cstr = NULL;
    jsize len = 0;
    jstring new_jstr;

    len = (*env)->GetStringLength(env, jstr);
    cstr = (char *) malloc(len + 1);//'\0'

    (*env)->GetStringUTFRegion(env, jstr, 0, len, cstr);

    cstr = strrev(cstr);

    new_jstr = (*env)->NewStringUTF(env, cstr);

    free(cstr);

    return new_jstr;
}

Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := strtool-jni
LOCAL_SRC_FILES := strtool-jni.c

include $(BUILD_SHARED_LIBRARY)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

The_Web3_社区

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

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

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

打赏作者

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

抵扣说明:

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

余额充值