Android-调用本地方法将小写字符串转成大写字符串/NDK-JNI开发实例(四)

Java调用本地方法将小写字符串转成大写字符串;

test3.c

//
// Created by yulongji on 2015/8/31.
//


#include 
#include 

//把java的字符串转换成c的字符串
char* Jstring2CStr(JNIEnv* env, jstring jstr) {
        //空指针用于接收转换后的字符串
        char* rtn = NULL;
        //获取String类
        jclass clsstring = (*env)->FindClass(env, "java/lang/String");
        //将字符串"GB2312"转成C语言的字符串
        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) {
                //分配alen+1大小的内存
                rtn = (char*) malloc(alen + 1); //"\0"
                //从    ba 中拷贝  alen 个字节到 rtn
                memcpy(rtn, ba, alen);
                rtn[alen] = 0;
        }
        (*env)->ReleaseByteArrayElements(env, barr, ba, 0); //释放字节数组元素内存
        return rtn;
}
JNIEXPORT jstring JNICALL Java_com_example_yu_1longji_android27_MainActivity_daxie
//得到c的字符串
        (JNIEnv * env, jobject obj, jstring jstr, jint lenght) {
        char* cstr = Jstring2CStr(env, jstr);
        int i;
        for (i = 0; i < lenght; i++) {
                *(cstr + i) -= 32;
        }
        return (*env)->NewStringUTF(env, cstr);
}


JNIEXPORT jstring JNICALL Java_com_example_yu_1longji_android27_MainActivity_bubian
        (JNIEnv * env, jobject obj, jstring jstr, jint lenght) {
    //得到c的字符串
    char* cstr = Jstring2CStr(env, jstr);
    int i;
    for (i = 0; i < lenght; i++) {
        *(cstr + i) += 32;
    }
    return (*env)->NewStringUTF(env, cstr);
}


生成的方法名:

/*
 * Class:     com_example_yu_longji_android27_MainActivity
 * Method:    jiami
 * Signature: (Ljava/lang/String;I)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_yu_1longji_android27_MainActivity_jiami
  (JNIEnv *, jobject, jstring, jint);

/*
 * Class:     com_example_yu_longji_android27_MainActivity
 * Method:    jiemi
 * Signature: (Ljava/lang/String;I)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_yu_1longji_android27_MainActivity_jiemi
  (JNIEnv *, jobject, jstring, jint);

布局文件:

activity_main.xml



    

    

    

    


    

    

MainActivity.java

package com.example.yu_longji.android27;

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

public class MainActivity extends Activity {

    EditText et;
    TextView tv1;
    TextView tv2;


    static{
        System.loadLibrary("test3");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et = (EditText)findViewById(R.id.et);
        tv1 = (TextView)findViewById(R.id.tv2);
        tv2 = (TextView)findViewById(R.id.tv4);

    }
    //大写
    public void click1(View view){
        String str = et.getText().toString().trim();
        int lenght = str.length();
        tv1.setText(daxie(str, lenght));
    }
    //不变
    public void click2(View view){
        String str = tv1.getText().toString().trim();
        int lenght = str.length();
        tv2.setText(bubian(str, lenght));
    }

    public native String daxie(String str, int length);
    public native String bubian(String str, int length);
}

结果图:
Android-调用本地方法将小写字符串转成大写字符串/NDK-JNI开发实例(四)_第1张图片

你可能感兴趣的:(Android-调用本地方法将小写字符串转成大写字符串/NDK-JNI开发实例(四))