文档章节

关于JNI返回十六进制字符串到JAVA层的说明

吃草小蚁
 吃草小蚁
发布于 2014/04/04 14:56
字数 438
阅读 412
收藏 5

由于java层使用的是unicode编码方式即UTF-16,而c/c++本地代码使用的是UTF-8编码方式,所以在JNI层返回16进制字符串的问题比较难搞,不多说,直接粘码:

JAVA部分代码:
public class MainActivity extends Activity {
    static {                                        
        System.loadLibrary("serialjni");                    
    }
    private byte[] bytes = new byte[12];

    private void callback() {
        int i;
        for(i=0; i<12; i++){
            System.out.println(bytes[i]&0xff);//见注释一
            if((bytes[i]&0xff) == 0xff){
                System.out.println("0xff\n");
                }
            }
        System.out.println(bytes);
    } 
 

JNI部分   
    bytearray = (*env)->NewByteArray(env,BUFSIZE+1);
    jclass cls1 = (*env)->GetObjectClass(env, obj);
    jclass cls2 = (*env)->GetObjectClass(env, obj);
    fid = (*env)->GetFieldID(env, cls1, "bytes", "[B");

    if (fid == NULL)
    {
            return; /* failed to find the field */
        }
        jmethodID mid = (*env)->GetMethodID(env, cls2, "callback", "()V");
        if (mid == NULL)
        {
            return; /* method not found */
        }


          (*env)->SetByteArrayRegion(env, bytearray, 0, BUFSIZE+1, buff1);
          (*env)->SetObjectField(env, obj, fid, bytearray);
          (*env)->CallVoidMethod(env, obj, mid);

                                             

注释一

在计算机中,正数是直接用原码表示的,如单字节5,在计算机中就表示为:0000 0101。负数用补码表示,如单字节-5,在计算机中表示为1111 1011。在C/C++中字节5编码为(UTF-8)0000 0101   -5编码为1111 1011,而在JAVA中5编码为(UTF-16)0000 0000 0000 0101, 而-5编码为1111 1111 1111 1011;

在C/C++中如果遇上这样的十六进制代码1000 0001,在通过JNI返回java的过程中VM就会把它当成负数,转化为1111 1111 1000 0001,这样就变成了-129;

前面说了JAVA采用的是UTF-16的编码方式,我们想要的是和C/C++本地代码一样的char类型十六进制buff串,必须在JAVA层得到的字符&0xff后才能得到和C/C++ 同样的16进制代码; 

期君粘转!

   
      
      


© 著作权归作者所有

共有 人打赏支持
吃草小蚁
粉丝 15
博文 63
码字总数 110019
作品 0
深圳
高级程序员
私信 提问
Android 8.1 源码_核心篇(一) -- 深入研究 JNI

开篇 核心源码 关键类 路径 MediaScanner.java frameworks/base/media/java/android/media/MediaScanner.java androidmediaMediaScanner.cpp frameworks/base/media/jni/androidmediaMediaS......

DeepCoder_Marco
08/28
0
0
JNI开发流程与引用数据类型的处理

今天我们来看下Java JNI,先看下维基百科给的定义, JNI, Java Native Interface, Java本地接口,是一种编程框架,使得Java虚拟机中的Java程序可以调用本地应用或库,也可以被其他程序调用。...

juexingzhe
05/04
0
0
Android JNI(一)——NDK与JNI基础

本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Native相互调用 Android JNI学习(四)——JNI的常用方法...

隔壁老李头
05/09
0
0
Android NDK开发之Jni的数据类型

在前面的一篇博客《Android NDK开发简介》,我简单地说明了Android NDK开发的流程,以及其重要的一环:JNI层得开发。今天我再详细说明一下自己的学习经验。 JNI是Java代码和C/C++代码通信的桥...

zhiweiofli
2013/03/15
0
0
JNI 之二 :java & c/c++ 相互通信及调用

JNI是Java Native Interface的缩写,JNI是一种机制,有了它就可以在java程序中调用其他native代码,或者使native代码调用java层的代码。也就是说,有了JNI我们可以使Android项目中,java层与...

LiSteven
2013/04/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

网站老被劫持快照跳转怎么办

最近很多公司的网站被劫持跳转到了bo彩、cai票网站上去,客户从百度点击进去会跳转,直接输入网站的域名不会跳转,网站快照也被劫持成bo彩的内容,site查看网站在百度的收录也出现问题,收录...

网站安全
14分钟前
1
0
给自己灌鸡汤

前言 看极客时间的《数据结构与算法之美》,中间有一篇文章是在说怎么坚持学习的,摘抄一些片段过来,激励自己。 https://time.geekbang.org/column/article/69607 致使你掉队的原因 一个人在...

grace_233
16分钟前
1
0
如何在网络视听行业建一扇内容安全大门?

在人工智能飞速发展的三年里,整个网络视听产业数字化发展速度非常迅猛。大数据作为如今这个时代的产物,正不断推动整个产业的发展。网络视听行业中存在海量的数据,比如视频内容、视频浏览量...

阿里云官方博客
25分钟前
1
0
云安全简史

课程介绍: DT时代我们每个人的生活在不知不觉中与云计算发生了千丝万缕的联系,起床、吃饭、出行、社交、工作、娱乐、购物等大多数应用都在云上,然而安全事件频发时刻在为我们敲响警钟,面对...

mcy0425
27分钟前
2
0
数字IT基础-数据采集总线

摘要: 日志服务是阿里自产自用的产品,在双十一、双十二和新春红包期间承载阿里云/蚂蚁全站、阿里电商板块、云上几千商家数据链路,每日处理来自百万节点几十PB数据,峰值流量达到每秒百GB,...

阿里云云栖社区
30分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部