jni android 参数 字符串 jstring,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的方法就行了,因为这一块我不是很熟悉,所以,自然我们想到的肯定是上网找咯,然后就有了下面的结果

9871b0be5924

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&)'

然后还是百度

9871b0be5924

QQ图片20180111121005.png

StackOverFlow

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

9871b0be5924

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;

}

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

编后语(最后吐槽):

就这么简单的一行代码解决的问题,为什么百度一下就出那么一大堆垃圾解决方案?

百度到的解决方案,自己到底有没有验证过?

奉劝大家,还是学点英语,遇到问题,到国外的网站上看看。百度这东西,筛选和验证就要花掉你大部分的时间,还不能保证能解决。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值