Android JNI中Char*转成jstring来返回结果 ps.附带我百(踩)度(过)的结(坑)果

我最想先吐槽一下,今天算法组在核心库中新增一个接口,显示核心版本信息,其实特别简单,就是调用一下核心中的方法

HWAPI  char* HWRC_GetVersion(void);

对,就这么简单的一个方法,然后以下是我的JNI方法实现

JNIEXPORT jstring JNICALL getVersionInfo(JNIEnv * env, jobject thiz)
{
    char* libCode = HWRC_GetVersion();
    jstring result = /*将libCode转换成jstring*/;
    return result;
}

那么问题就简单了,只需要找一个将 char* 转换成 jstring的方法就行了,因为这一块我不是很熟悉,所以,自然我们想到的肯定是上网找咯,然后就有了下面的结果

Android JNI中Char*转成jstring来返回结果 ps.附带我百(踩)度(过)的结(坑)果_第1张图片
QQ图片20180111114241.png

具体的我就不点进去给你们一一展示了,感兴趣的可以自己去展开看。然后我就得到了这样的代码:

//将const char类型转换成jstring类型
jstring charTojstring( JNIEnv* env, const char* pat )
{
    // 定义java String类 strClass
    jclass strClass = (env)->FindClass("Ljava/lang/String;");
    // 获取java String类方法String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
    jmethodID ctorID = (env)->GetMethodID(strClass, "", "([BLjava/lang/String;)V");
    // 建立byte数组
    jbyteArray bytes = (env)->NewByteArray((jsize)strlen(pat));
    // 将char* 转换为byte数组
    (env)->SetByteArrayRegion(bytes, 0, (jsize)strlen(pat), (jbyte*)pat);
    //设置String, 保存语言类型,用于byte数组转换至String时的参数
    jstring encoding = (env)->NewStringUTF("utf-8");
    //将byte数组转换为java String,并输出
    return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);
}

习惯性点了好几条结果,发现这一条最详细,其实差不多都是这个结果。剩下的就是编译,拷贝,运行。一切都是那么顺利,没有任何错误。Perfect!!
然而,事情如此简单,我就懒得写这么一篇文章来记录一下了。
测试,已调用就崩溃了,那得调试了,JNI里面调试方式,只有打log了(我的认知,大婶们路过留情)。具体操作不赘述了。
结果发现错误在

    // 定义java String类 strClass
    jclass strClass = (env)->FindClass("Ljava/lang/String;");

这我能说什么?这让我没法往下找问题了。就这么简单的代码。放弃,再找找其他办法。
百度翻了几页,基本都是大同小异(你抄我,我抄他)。有意思吗??你们真的验证过吗?
本想偷个懒,快速搞定,结果发现这么点破事,都搞不定。那就自己来看看相关知识吧!
发现一个有价值的文章JNI 入门介绍
这里并没有解决我的问题,但是对于问题的理解和JNI的认识很有帮助。
我还了解了一下JNIEnv这个东西JNIEnv解析
然后,我用以下方式来实现:

jstring result = (env)->NewStringUTF(env, libCode);

我用的C++来写的,所以使用的是这种写法,然后运行,报错

no matching function for call to '_JNIEnv::NewStringUTF(JNIEnv&, char&)'

然后还是百度


Android JNI中Char*转成jstring来返回结果 ps.附带我百(踩)度(过)的结(坑)果_第2张图片
QQ图片20180111121005.png

StackOverFlow
真不是我捧它,技术解决方案,绝对算得上神器中的神器。

Android JNI中Char*转成jstring来返回结果 ps.附带我百(踩)度(过)的结(坑)果_第3张图片
QQ图片20180111121236.png

很清楚明了,修改后的最终代码

JNIEXPORT jstring JNICALL getDictVersionInfo(JNIEnv * env, jobject thiz)
{
    char* libCode = HWRC_GetVersionDic((unsigned char*)gDict);
    jstring result = (env)->NewStringUTF( libCode);
    return result;
}

编译,运行,测试,完美。

编后语(最后吐槽):

  1. 就这么简单的一行代码解决的问题,为什么百度一下就出那么一大堆垃圾解决方案?
  2. 百度到的解决方案,自己到底有没有验证过?
  3. 奉劝大家,还是学点英语,遇到问题,到国外的网站上看看。百度这东西,筛选和验证就要花掉你大部分的时间,还不能保证能解决。

你可能感兴趣的:(Android JNI中Char*转成jstring来返回结果 ps.附带我百(踩)度(过)的结(坑)果)