文档章节

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

吃草小蚁
 吃草小蚁
发布于 2014/04/04 14:56
字数 438
阅读 408
收藏 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
深圳
高级程序员
私信 提问
JNI开发流程与引用数据类型的处理

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

juexingzhe
05/04
0
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
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平台上的JNI技术介绍

NDK简介 Android是由Google领导开发的操作系统,Android依靠其开放性,迅速普及,成为目前最流行的智能手机操作系统。 图0-1 Android系统架构图 图0-1是Android系统架构图。大多数程序位于最...

ChowJames
2012/10/01
0
0
JNI 之二 :java & c/c++ 相互通信及调用

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

LiSteven
2013/04/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

w, vmstat, top, sar, nload命令查看系统状态信息

w/uptime 查看系统负载 cat /proc/cpuinfo 查看cpu核数 vmstat 监控系统状态,用法 vmstat 1,关键的几列: r, b, swpd, si, so, bi, bo, us, wa top 查看进程使用资源情况 top -c 显示详细的...

野雪球
今天
1
0
小白创建一个spring boot项目

进入 https://start.spring.io/

lilugirl
今天
2
0
Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源

背景 随着应用越来越复杂,依赖越来越多,日志系统越来越混乱,有时会出现一些奇怪的日志,比如: [] [] [] No credential found 那么怎样排查这些奇怪的日志从哪里打印出来的呢?因为搞不清...

hengyunabc
今天
2
0
home hosts

home hosts lwk@qwfys:~$ cat /etc/hosts127.0.0.1 localhost127.0.1.1 qwfys192.168.56.101vm600.qwfys.com39.108.212.91alpha1.ppy.com39.108.117.122alpha2.p......

qwfys
今天
3
0
大数据教程(6.1)hadoop生态圈介绍及就业前景

1. HADOOP背景介绍 1.1、什么是HADOOP 1.HADOOP是apache旗下的一套开源软件平台 2.HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 3.HADOOP的核心组...

em_aaron
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部