java数据结构默认均为有符号数,而通过jni转换到c/c++层,却不一定是有符号数。

如若在java中存储的即为无符号数,则在jni中可将jbyte直接进行类型转换。

若进行操作,则可在计算时,先将byte&0xff,这样即可转换为32位数据,而后再进行计算。

转换方式如下:

1、jbyteArray转换为unsigned char*

Java

 public class example {
public final static native void set_Foo_array(long jarg0, short[] jarg1);
public final static native short[] get_Foo_array(long jarg0);
}

c++ code:

class Foo {
public:
unsigned char array[];
}; extern "C"{
JNIEXPORT void JNICALL Java_example_set_1Foo_1array(JNIEnv *jenv, jclass jcls, jlong jarg0, jshortArray jarg1) {
Foo *arg0 ;
unsigned char *arg1 ;
int i ;
jshort* jarg1_carray ;
jsize jarg1_len = jenv->GetArrayLength(jarg1) ; arg0 = *(Foo **)&jarg0;
jarg1_carray = jenv->GetShortArrayElements(jarg1, );
arg1 = (unsigned char *) malloc(jarg1_len * sizeof(unsigned char ));
for(i=; i<jarg1_len; i++)
arg1[i] = (unsigned char )jarg1_carray;
{
int i;
for (i=; i<; i++)
arg0->array[i] = arg1[i];
}
jenv->ReleaseShortArrayElements(jarg1, jarg1_carray, );
free(arg1);
}} extern "C"{
JNIEXPORT jshortArray JNICALL Java_example_get_1Foo_1array(JNIEnv *jenv, jclass jcls, jlong jarg0) {
jshortArray jresult = ;
Foo *arg0 ;
unsigned char *result ;
jshort* jnitype_ptr = ;
int k ; arg0 = *(Foo **)&jarg0;
result = (unsigned char *)(unsigned char *) (arg0->array);
jresult = jenv->NewShortArray();
jnitype_ptr = jenv->GetShortArrayElements(jresult, );
for (k=; k<; k++)
jnitype_ptr[k] = (jshort)result[k];
jenv->ReleaseShortArrayElements(jresult, jnitype_ptr, );
return jresult;
}} The code comes from the output of swig (www.swig.org) - a tool which generated the JNI and Java code given the C++ class definition above.

2、char*转jbyte

 static .. jvm; // ref to jvm
static jobject printAPI; // the static class ref
static jmethodID loadBuffer; // the static method ref void loadImage(int x, int y, int width, int height, char* pixels, int maxWidth, int maxHeight){
JNIEnv* env;
jint result = (*jvm)->GetEnv(jvm, &env, JNI_VERSION_1_2);
if(result < || env == NULL){
fprintf(stderr, "Error finding JNI environment\n");
}else{
int i, size = width*height*;
jbyteArray rgb; // the byte array
jbyte* v; // array of jbytes for transfer operation /* Transfer char* to jbyteArray */
rgb = (*env)->NewByteArray(env, width * height *);
v = malloc( (width * height *) * sizeof(jbyte));
if( !rgb || !v ){
fprintf(stderr, "Error allocating memory in loadImage(..)");
return;
}
for(i=;i<size; ++i) v[i] = (jbyte) pixels; (*env)->SetByteArrayRegion(env, rgb, , size, v); /* send pixel dump to gui */ (*env)->CallStaticIntMethod(env, printAPI, loadBuffer, x, y, width, height, rgb); } } the method on the java side is
static void loadByteArray( int x, int y, int w, int h, byte[] rgb ){..}
Hope it helps.

jni——如何转换有符号与无符号数的更多相关文章

  1. C++有符号和无符号数的转换

    本文转自:http://www.94cto.com/index/Article/content/id/59973.html 1.引例: 今天在做了一道关于有符号数和无符号数相互转换及其左移/右移的问题 ...

  2. 【C语言学习趣事】_33_关于C语言和C++语言中的取余数(求模)的计算_有符号和无符号数的相互转换问题

    最近再次复习C++语言,用的教材是<C++ Primer>这本教材, 看到第二章的时候,里面有个问题困扰了我. 于是想上网查查怎么回事, 结果看了很久都没有得到一个满意的答案. 书上有这么 ...

  3. c语言中为什么左移不分符号数无符号数,而右移分呢??

    因为在C语言标准中,只规定了无符号数的移位操作是采用逻辑移位(即左移.右移都是使用的逻辑左移和逻辑右移).而对于有符号数,其左移操作还是逻辑左移,但右移操作是采用逻辑右移还是算术右移就取决于机器了!( ...

  4. 关于C语言中不同类型数据进行计算 有符号和无符号数进行计算

    float是8个有效位, 做个试验: 输出如下: 上面说明了什么: 1, 18/2.2 是除不尽的, 因为是define,所以没有给ratio变量赋值类型,但是从sizeof输出的结果是8,所以系统默 ...

  5. signed 与 unsigned 有符号和无符号数

    unsigned int a = 0; unsigned int b = -1; // b 为 0xffffffff unsigned int c = a - 1; // c 为 0xffffffff

  6. C语言-无符号数与有符号数不为人知的秘密

    一.无符号数与有符号数 1.计算机中的符号位 数据类型的最高位用于标识数据的符号 -最高位为1,表明这个数为负数 -最高位为0,表明这个数为正数 #include <stdio.h> in ...

  7. 关于有符号数和无符号数的转换 - C/C++

    转载自:http://www.94cto.com/index/Article/content/id/59973.html 1.引例: 今天在做了一道关于有符号数和无符号数相互转换及其左移/右移的问题, ...

  8. JAVA byte有无符号数的转换

    如果你只需要对英文文本的每个字节进行数据处理,则无需考虑有符号数和无符号数的转换问题: 但如果你需要对含有中文的文本进行字节处理,则可能需要考虑有无符号数的转换问题. 以下代码均为Java代码. 1. ...

  9. C语言中无符号数和有符号数之间的运算

    C语言中无符号数和有符号数之间的运算 C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. un ...

随机推荐

  1. 《发际线总是和我作队》第八次团队作业:Alpha冲刺 第五天

    项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十二 团队作业8:软件测试与Alpha冲刺实验十一 团队作业7:团队项目设计完善&编码 团队名称 发际线总和我作队 作业学 ...

  2. Supreme Number

    A prime number (or a prime) is a natural number greater than 11 that cannot be formed by multiplying ...

  3. Delete 语句带有子查询的sql优化

    背景: 接到开发通知,应用页面打不开,让我协助... (开发跟我说,表GV_BOOKS一直有锁,锁了有1个多小时了,问我能不能把锁释放掉,我回答他们说,这肯定是sql性能问题,表上有锁是正常现象,不是 ...

  4. linux系统日志中出现大量systemd Starting Session ### of user root 解决

    这种情况是正常的,不算是一个问题 https://access.redhat.com/solutions/1564823 Environment Red Hat Enterprise Linux 7 ...

  5. ES5的数组方法

    参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array Array.prot ...

  6. 深入理解JavaScript的设计模式

    使用适当的设计模式可以帮助你编写更好.更易于理解的代码.这样的代码也更容易维护.但是,重要的是不要过度使用它们.在使用设计模式之前,你应该仔细考虑你的问题是否符合设计模式. 当你开始一个新的项目时,你 ...

  7. JavaScript 高级技巧 Memoization

    memoization 来源于拉丁语 memorandum ("to be remembered"),不要与 memorization 混淆了. 首先来看一下维基百科的描述: In ...

  8. 项目中遇到的超卖问题及解决办法(使用go做测试工具)

    超卖问题:在一个很短的时间内,Mysql的数据状态在 取出,比较,提交,或修改中,另外一个进程访问数据导致的超卖问题. 案例: 1.前端没有做限制,如果用户连续点击签到,那么会有多条数据发送到后端,如 ...

  9. mysql数据库中的索引有那些、有什么用

    本文主要讲述了如何加速动态网站的MySQL索引分析和优化. 一.什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第 ...

  10. hadoop上传文件报错

    19/06/06 16:09:26 INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad ...