JNI NewStringUTF报错解决方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JNI NewStringUTF报错解决方案相关的知识,希望对你有一定的参考价值。

参考技术A 在使用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相关的知识,可以在网上找到都有写,也可以看我之前写的文章
https://www.jianshu.com/p/1875a7ffefee

解决JNI调试报错:No symbol directories found

项目从AS 2.3迁移到AS 3.0编译后,发现无法进行调试。在控制台中输出下面信息:

Attention! No symbol directories found - please check your native debug configuration

在网上搜了一下资料,有人提出了下面的解决方案:

  1. 打开app/build.gradle文件
  2. dependencies标签中加入下面的设置:
releaseCompile project(path: ':youModuleName', configuration: 'release')
debugCompile project(path: ':youModuleName', configuration: 'debug')
  1. 然后打开你的module/build.gradle文件
  2. android标识中加入publishNonDefault true

试验了一下,提示报错:

Unable to resolve dependency for ‘:app@debug/compileClasspath’: Could not resolve project :xxxxx.

貌似是说找不到项目以来的debug配置,继续查找资料,有人说依赖和被依赖的module/build.gradle中需要设置buildTypes并且里面必须包含你所设置的配置项,如:

buildTypes
      debug ... 
      release ... 

但是我的项目中已经配置该项信息了,最后,经过不懈努力,找到了适合自己的方法:

  1. 首先app/build.gradle文件的dependencies标签中要配置debugCompile project(':youModuleName')

注:这里不设置configuration参数

  1. 然后module/build.gradle文件的android标签中加入publishNonDefault true
  2. 打开moudle的iml文件,找到<facet type="native-android-gradle" name="Native-Android-Gradle">,看一下它的子节点:
<configuration>
        <option name="SELECTED_BUILD_VARIANT" value="debug" />
</configuration>

如果SELECTED_BUILD_VARIANTvalue值不是debug,要改成debug
4. 然后对项目进行debug,OK!能够断点了!

以上是关于JNI NewStringUTF报错解决方案的主要内容,如果未能解决你的问题,请参考以下文章

Android JNI开发五: JNI字符串的处理

Android JNI开发五: JNI字符串的处理

java jni 调用 c 代码, c 中 unsigned char* 数据 如何传给java?

jni中的参数含义

Android NDK JNI WARNING: illegal start byte 0x

JNI CPP实现jni接口,采用方法名来识别本地方法的方式(相对于动态加载) 报错解决方法