但是实际工作中肯定不可能每次都让你返回个int类型; 我们先来两张表:
Java基本数据类型 Java类型JNI类型C/C++类型大小booleanjbooleanunsigned char8位bytejbytechar8位charjcharunsigned short16位shortjshortshort16位intjintint32位longjlonglong long64位floatjfloatfloat32位doublejdoubledouble64位 Java引用类型映射 Java类型原生类型java.lang.Classjclassjava.lang.Throwablejthrowablejava.lang.StringjstringOther objectsjobjectsjava.lang.Object[]jobjectArrayboolean[]jbooleanArraybyte[]jbyteArraychar[]jcharArrayshort[]jshortArrayint[]jintArraylong[]jlongArrayfloat[]jfloatArraydouble[]jdoubleArrayOther 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代码中为数组赋值的两种方式都可以