Android Studio3.0开发JNI流程------JNI中字符串拼接的二种方式(C++)

来源:互联网 发布:sql语句范围查询 编辑:程序博客网 时间:2024/06/04 17:54

字符串拼接在java中很常见,比如拼接url路径,那么到了jni开发中怎么使用java中拼接字符串呢?不废话了啊,直接来个案例分析

我们将Android Studio3.0默认创建的工程文本显示从jni中拼接输出…

我们写一个简单的字符串返回的native方法,调用时给“Hello”参数,调用二种不同方式的拼接方法,在屏幕文本时输出内容为:Hello-World以及 Hello,欢迎来到JNI的世界!

MainActivity.java类:

package fj.clover.jnistringbuilder;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;public class MainActivity extends AppCompatActivity {    static {        System.loadLibrary("native-lib");    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TextView tv = (TextView) findViewById(R.id.sample_text);        //调用native本地方法调用,实现在屏幕输出Hello-World!        tv.setText(getString("Hello"));        TextView tv1 = (TextView) findViewById(R.id.sample_text1);        //调用native本地方法调用,实现在屏幕输出Hello,欢迎来到JNI的世界!        tv1.setText(getString1("Hello"));    }    /**     * 以下native方法主要是在JNI代码(C++)中实现getStr()方法内容     * @param str     * @return     */    public native String getString(String str);   //方式一    public native String getString1(String str);  //方式二    /*public String getStr(String str){        String string="-World!";        return str+string;    }*/}

C++代码

#include <jni.h>#include <string.h>#include <stdlib.h>/** * jstring转char函数... * @param env * @param jstr * @return */char *Jstring2CStr(JNIEnv *env, jstring jstr) {    char *rtn = NULL;    jclass clsstring = env->FindClass("java/lang/String");    jstring strencode = env->NewStringUTF("UTF-8");   //这里填写是工作空间的编码,若是默认中文则是GB2312    jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");    jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);    jsize alen = env->GetArrayLength(barr);    jbyte *ba = env->GetByteArrayElements(barr, JNI_FALSE);    if (alen > 0) {        rtn = (char *) malloc(alen + 1);  //字符串拼接函数...        memcpy(rtn, ba, alen);        rtn[alen] = 0;    }    env->ReleaseByteArrayElements(barr, ba, 0);    return rtn;}extern "C"/** * 字符串拼接的第一种方法 * @param env * @param instance * @param str_ * @return */JNIEXPORT jstring JNICALLJava_fj_clover_jnistringbuilder_MainActivity_getString(JNIEnv *env, jobject instance,                                                       jstring str_) {    char *cstr = Jstring2CStr(env, str_);    char *hellostr = "-World";    strcat(cstr, hellostr); //拼接两个字符串    return env->NewStringUTF(cstr);}extern "C"JNIEXPORT jstring JNICALL/** * 字符串拼接的第二种方法 * @param env * @param instance * @param str_ * @return */Java_fj_clover_jnistringbuilder_MainActivity_getString1(JNIEnv *env, jobject instance,                                                        jstring str_) {    jstring message = env->NewStringUTF(            strcat((char *) env->GetStringUTFChars(str_, JNI_FALSE), ",欢迎来到JNI的世界!"));    return message;}

输出结果:
这里写图片描述

阅读全文
0 0
原创粉丝点击