JNI NewStringUTF报错解决方案

在使用JNI的时候,有的人常常习惯返回jstring给java层,比如我,所以我们一般都会在最后写

但是这样很容易出现一些问题,因为这是转UTF,比如我碰到的,在动态库里面写了某些操作,导致生成的result是一串乱码,这样转UTF就会直接报错

上网查了下,很多人也有提到会碰到input is not valid Modified UTF-8这个问题,看了一些人写的解决方案,无外乎使用两种:

(1)不返回jstring,返回jbyte,再Java层再将字节数组拼接成String,这种方法我没有试过。理论上可以,但是我嫌麻烦。

(2)将char*转成jbyte然后再用JNI拼成jstring再返回,我试过这种方法,不太好用。

这时候有一个很方便的版本能解决这个问题,没错,就是使用Base64,既然是指向utf-8的问题,那么使用Base64准没错,我们可以先将char*转成Base64的ctring,转成jstring返回到java层的时候再进行Base64解码,虽然是多做了一步编码和解码的操作,但至少能保证应用不会崩溃。

关于Base64相关的知识,可以在网上找到都有写,也可以看我之前写的文章

/p/1875a7ffefee