但是实际工作中肯定不可能每次都让你返回个int类型;
我们先来两张表:
Java基本数据类型
Java类型 | JNI类型 | C/C++类型 | 大小 |
---|---|---|---|
boolean | jboolean | unsigned char | 8位 |
byte | jbyte | char | 8位 |
char | jchar | unsigned short | 16位 |
short | jshort | short | 16位 |
int | jint | int | 32位 |
long | jlong | long long | 64位 |
float | jfloat | float | 32位 |
double | jdouble | double | 64位 |
Java引用类型映射
Java类型 | 原生类型 |
---|---|
java.lang.Class | jclass |
java.lang.Throwable | jthrowable |
java.lang.String | jstring |
Other objects | jobjects |
java.lang.Object[] | jobjectArray |
boolean[] | jbooleanArray |
byte[] | jbyteArray |
char[] | jcharArray |
short[] | jshortArray |
int[] | jintArray |
long[] | jlongArray |
float[] | jfloatArray |
double[] | jdoubleArray |
Other arrays | jArray |
基本数据类型可以直接与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代码中为数组赋值的两种方式都可以