JNI 通过形参String返回数据的方法

标题虽说是String但实际使用了StringBuffer

很简单,往下看吧,直接cp过去就可以用了。

package com.zkzh.alpr.jni;

public class Decodec {

    public static native int test(String inPut, StringBuffer outPut);

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

}
#include <android/log.h>
#include <string.h>

/*
 * Class:     jp_ac_jaist_myjnitest_Codec
 * Method:    test
 * Signature: (Ljava/lang/String;Ljava/lang/StringBuffer;)I
 */
JNIEXPORT jint JNICALL Java_jp_ac_jaist_myjnitest_Codec_test
  (JNIEnv* env, jclass, jstring inputStrJstr, jobject outputJobj)
{
    const char* pInputStr = env->GetStringUTFChars(inputStrJstr, JNI_FALSE);
    if (pInputStr == NULL)
    {
        return -1;
    }

    __android_log_print(ANDROID_LOG_DEBUG, "Cosmo Test", "pInputStr:%s", pInputStr);


    jclass outputJcls = env->GetObjectClass(outputJobj);
    if (outputJcls == NULL)
    {
        __android_log_print(ANDROID_LOG_DEBUG, "Cosmo Test", "Unable to find outputJcls");
        return -1;
    }

    jfieldID valueJfId = env->GetFieldID(outputJcls, "value", "[C");
    if (valueJfId == NULL)
    {
        __android_log_print(ANDROID_LOG_DEBUG, "Cosmo Test", "Unable to get class StringBuffer.value's jfieldID");
        return -1;
    }
    jmethodID appendJmId = env->GetMethodID(outputJcls, "append", "(Ljava/lang/String;)Ljava/lang/StringBuffer;");
    if (appendJmId == NULL)
    {
        __android_log_print(ANDROID_LOG_DEBUG, "Cosmo Test", "Unable to find appendJmId");
    }

    char name[200];
    memset(name, 0x00, sizeof(name));

    strncpy(name, "Cosmo Wang", sizeof(name) - 1);

    jstring _jstring = env->NewStringUTF(name);

    env->CallObjectMethod(outputJobj, appendJmId, _jstring);


    env->ReleaseStringUTFChars(inputStrJstr, pInputStr);

    return 0;
}


 

使用方法:

StringBuffer output = new StringBuffer();

Codec.test("Cosmo is Wangzy", output);

Log.e("Cosmo", "output:" + output);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值