Java与底层数据类型关系

但是实际工作中肯定不可能每次都让你返回个int类型;
我们先来两张表:

                                  Java基本数据类型
Java类型JNI类型C/C++类型大小
booleanjbooleanunsigned char8位
bytejbytechar8位
charjcharunsigned short16位
shortjshortshort16位
intjintint32位
longjlonglong long64位
floatjfloatfloat32位
doublejdoubledouble64位
                                    Java引用类型映射
Java类型原生类型
java.lang.Classjclass
java.lang.Throwablejthrowable
java.lang.Stringjstring
Other objectsjobjects
java.lang.Object[]jobjectArray
boolean[]jbooleanArray
byte[]jbyteArray
char[]jcharArray
short[]jshortArray
int[]jintArray
long[]jlongArray
float[]jfloatArray
double[]jdoubleArray
Other arraysjArray

基本数据类型可以直接与C/C++的相应基本数据类型映射;
引用类型以不透明的引用方式传递给原生代码, 而不是以原生数据类型的形式呈现, 因此引用类型不能直接使用和修改, JNI提供了一系列的API方便我们进行传递.
可以在这里进行查找:
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html
然后我们开始最基本的数据类型传递:
1. 传递int和传递byte:
这里写图片描述
**注意虽然byte为基本数据类型, 但是C中并没有byte类型, 只有char类型, char为一个字节.
又Java中byte为一个字节, 所以可以直接char chs = jbyte bys;**
基本数据类型的传递到此结束, 接下来开始引用数据类型:
2. 先从string入手:
这里写图片描述

有几点需要注意:
1. GetStringUTFChars(env, msg_, JNI_FALSE);
2. (*env)->ReleaseStringUTFChars(env, msg_, msg);
关于第一点,我们打开jni.h文件有:

(1)const jchar* (*GetStringChars)(JNIEnv*,jstring, const jchar*)
(2)const char* (GetStringUTFChars)(JNIEnv*,jstring, const  char*)

函数(1)可以将unicode格式的Java字符串转为c字符串;
函数(2)可以将utf-8格式的Java字符串转为c字符串;
第三个参数有JNI_TRUE和JNI_FALSE两个值, JNI_TRUE表示

true:获取的字符串是原始字符串的拷贝;
false:获取的字符串和原始字符串指向内存中的同一份数据;

关于第二点:

void (*ReleaseStringChars)(JNIEnv*, jstring, const jchar*);
void (*ReleaseStringUTFChars)(JNIEnv*, jstring, const char*);

切记c和Java的区别, Java中,当我们不再使用一个对象时, 他会在某一时刻被gc回收, 但是在c中, 需要我们自己手动去释放该指针

jstring:Java传递过来的
jchar*/char*: 我们获取的字符串

3. Java代码获取C返回的字符串:
其实由于as越来越健壮, 直接在Java中写好方法名, 然后ctrl+1就在c中帮我们创建好了方法甚至逻辑也帮我们写好了.
这里写图片描述
4. 既然C中没有byte数据类型, 那么我们就来一个传递与获取byte[]
这里写图片描述
C代码中为数组赋值的两种方式都可以

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值