Android技术13:NDK中无法返回中文问题解决

1问题

为了加强软件的安全性,将http请求,封装在jni中,即通过c语言实现http请求,返回字符串。然而字符串往往包含中文,当返回类型为jstring时,就会出现JNI WARNING: illegal continuation byte 0xd0这错误,这是因为jni中c文件有中文, 中文不能被识别。无法使用(*env)->NewStringUTF(env,s);返回字符串。

2.方案

2.1将native方法返回类型为byte数组  例如:private native byte[] getData();

2.2实现http请求,数据保存在char*p中;

2.3新建字节数组jbyteArray array=(*env)->NewByteArray(env, len);

2.4(*env)->SetByteArrayRegion(env,array,0,len,p);最后返回array

2.5在java代码中将字节转换为字符串,注意编码类型byte[] s=getData();String str=new String(s,"GB2312");

接下里就可以实现返回中文数据,然后对数据进一步解析。

Android技术13:NDK中无法返回中文问题解决,布布扣,bubuko.com

时间: 2024-10-04 23:30:42

Android技术13:NDK中无法返回中文问题解决的相关文章

Spring MVC中@ResponseBody 返回中文字符串乱码问题

在MVC配置文件中配置 <mvc:annotation-driven> <!-- 解决@ResponseBody返回中文乱码 --> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name

关于Django中JsonResponse返回中文字典编码错误的解决方案

解决方案:JsonResponse(data, json_dumps_params={'ensure_ascii':False}) ! data是需要渲染的字典 def master(request): data = {'这是':'主页'} return JsonResponse(data, json_dumps_params={'ensure_ascii':False}) 显示效果: 首先我们看JsonResponse()的源码: class JsonResponse(HttpResponse

Android技术12:NDK模拟登陆

由于Android应用程序大多使用Java编写,所有很容易通过反编译获取源代码,因此为了保持核心算法,逻辑的安全性,大多应用程序将该部分使用c或c++实现,例如:用户的登陆,底层采用c或c++代码编写.下面将演示简单的c语言验证用户名和密码正确性,实现登录. 1.创建Android应用程序 创建过程与一般android应用程序类似,添加2个EditText和1个Button,示例图如下 布局文件 1 <LinearLayout xmlns:android="http://schemas.a

Android技术18:Android中Adapter类详解

1.Adapter设计模式 Android中adapter接口有很多种实现,例如,ArrayAdapter,BaseAdapter,CursorAdapter,SimpleAdapter,SimpleCursorAdapter等,他们分别对应不同的数据源.例如,ArrayAdater对应List和数组数据源,而CursorAdapter对应Cursor对象(一般从数据库中获取的记录集).这些Adapter都需要getView方法返回当前列表项显示的View对象.当Model发生改变时,会调用Ba

Android技术6:Android中对于Bitmap的处理

很多Android应用在运行时,会遇到运行缓慢,不流畅等影响用户体验问题,这有一部分原因与图片有密切关系.当android应用需要加载较大较多的照片时,经常反应迟缓,甚至由于OOM,造成系统奔溃.下面将提供一种可行的解决方案. 1.获取图片的宽高属性 1 BitmapFactory.Options options=new BitmapFactory.Options(); 2 options.inJustDecodeBounds=true; 3 BitmapFactory.decodeFile(f

Android技术22:Android中AIDL

在Android中进程内部通过全局变量,文件,preference,数据库作为数据的载体实现数据共享和通信.然后在进程之间则需要借助Binder实现IPC调用.Android进程通信框架:服务端,客户端,Linux binder驱动.Binder驱动成为连接两端的桥梁.我们首先通过aidl语言实现一个简单的多进程通信.具体实现步骤如下: 1.定义aidl文件 IService.aidl,定义一个接口,test() ,不包含负责的类和数据. 1 package com.demo.ipc; 2 3

Android技术9:Android NDK日志调试

在Android中我们经常使用Log来调试程序,NDK中也为我们提供输出日志的方法. 1.引入头文件<android/log.h> #include<android/log.h> 2.定义宏 #define LOG_TAG "System.out.c"#define LOGD(...) _android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,_VA_ARGS_)#define LOGI(...) _android_log_pri

Android技术4:Android4.4中如何更新相册信息

当你到这篇文章时,你肯定遇到了在Android4.4版本中需要使用本地相册时,无法找到最新的照片这一问题.在Android4.4以前在需要获取手机本地图片信息时,只需要发送一个广播更新相册信息,然而系统更新到4.4之后该广播无效且报错. 广播如下: sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

Android技术14:Android中layout_weight属性解析

为了更好的对空间进行布局,在LinearLayout中使用layout_weight,然后对于这一属性,在有些书上或者Android的初学者直接认为layout_weight值越大,控件权重就越大,所占用的空间就越大或者layout_wight值越小,控件空间就越大.这两种都是片面的,没有真正认识到layout_weight含义以及如何布局.下面首先演示使用代码为什么会有这两种感觉. 1.演示权重成反比 LinearLayout设置水平布局,然后里面空间宽度为fill_parent,layout