我最想先吐槽一下,今天算法组在核心库中新增一个接口,显示核心版本信息,其实特别简单,就是调用一下核心中的方法
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的方法就行了,因为这一块我不是很熟悉,所以,自然我们想到的肯定是上网找咯,然后就有了下面的结果
具体的我就不点进去给你们一一展示了,感兴趣的可以自己去展开看。然后我就得到了这样的代码:
//将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, "<init>", "([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&)'
然后还是百度
StackOverFlow
真不是我捧它,技术解决方案,绝对算得上神器中的神器。
很清楚明了,修改后的最终代码
JNIEXPORT jstring JNICALL getDictVersionInfo(JNIEnv * env, jobject thiz)
{
char* libCode = HWRC_GetVersionDic((unsigned char*)gDict);
jstring result = (env)->NewStringUTF( libCode);
return result;
}
编译,运行,测试,完美。
编后语(最后吐槽):
- 就这么简单的一行代码解决的问题,为什么百度一下就出那么一大堆垃圾解决方案?
- 百度到的解决方案,自己到底有没有验证过?
- 奉劝大家,还是学点英语,遇到问题,到国外的网站上看看。百度这东西,筛选和验证就要花掉你大部分的时间,还不能保证能解决。