1.数据类型
2.引用类型
3.数据和对象类型的基本操作
(1)string类型,在native中并不提供修改string类型函数,因为java中也是步伐修改存在的string的类型即string类型在java中不变类型的
jstring javaString;
javaString = (*env)->NewStringUTF(env, "Hello World!");
逆过程
const jbyte* str;
jboolean isCopy;
str = (*env)->GetStringUTFChars(env, javaString, &isCopy);
即让是对象(引用类型),我们就要去释放他的引用,这个细节是java程序员比较容易忘记的
(*env)->ReleaseStringUTFChars(env, javaString, str);
(2)数据类型
通过New<Type>Array类创建
type范围:Int, Char, Boolean, etc
jintArray javaArray;
javaArray = (*env)->NewIntArray(env, 10);
if (0 != javaArray) {
/* You can now use the array. */
}
接着就是操作数据中的元素
从java中拷贝
jint nativeArray[10];
(*env)->GetIntArrayRegion(env, javaArray, 0, 10, nativeArray);
逆过程
(*env)->SetIntArrayRegion(env, javaArray, 0, 10, nativeArray);
或者直接全部拷贝
<span style="font-family:TheSansMonoConNormal;color:#000000;FONT-VARIANT: normal; FONT-STYLE: normal; FONT-SIZE: 9pt">jint* nativeDirectArray;
<span style="font-family:TheSansMonoConNormal;color:#000000;FONT-VARIANT: normal; FONT-STYLE: normal; FONT-SIZE: 9pt">jboolean isCopy;</span>
</span>
nativeDirectArray = (*env)->GetIntArrayElements(env, javaArray, &isCopy);
别忘记释放
Release<Type>ArrayElemens
例如
(*env)->ReleaseIntArrayElements(env, javaArray, nativeDirectArray, 0);
记得数据的内容可能被我们已经修改了,所以追后的一个参数告诉系统如何处理
(3).字节类型
字节类型是比较重要而且是需要注意的,因为字节没有大小,他需要你指定大小,在java中之所以string为不变类型就是这个原因吧,因为string保存必须指定内存大小
所以我们动态申请
unsigned char* buffer = (unsigned char*) malloc(1024);
...
jobject directBuffer;
directBuffer = (*env)->NewDirectByteBuffer(env, buffer, 1024);
我们直接申请了1024个字节来的buffer来构建jobject
接着我们也可以获取
unsigned char* buffer;
buffer = (unsigned char*) (*env)->GetDirectBufferAddress(env,
directBuffer);
记得free申请的内存
4.获取java class的属性
(1)获取class
jclass clazz;
clazz = (*env)->GetObjectClass(env, instance);
instance对应java的类型
(2)获取字段
jfieldID instanceFieldId;
instanceFieldId = (*env)->GetFieldID(env, clazz,"instanceField", "Ljava/lang/String;");
特殊的---静态类型
jfieldID staticFieldId;
staticFieldId = (*env)->GetStaticFieldID(env, clazz,"staticField", "Ljava/lang/String;");
对于对象GetStatic<Type>Field
jstring staticField;
staticField = (*env)->GetStaticObjectField(env, clazz, staticFieldId);
5.调用方法
调用方法有两种
思路 找到方法的ID,再call方法
(1)调用实例方法
instanceMethodId = (*env)->GetMethodID(env, clazz,"instanceMethod", "()Ljava/lang/String;");
(2)调用静态方法
staticMethodId = (*env)->GetStaticMethodID(env, clazz,"staticMethod", "()Ljava/lang/String;");
接着调用方法,方法会有返回类型,所以使用
(1)调用实例方法
Call<Type>Method
如:
jstring instanceMethodResult;
instanceMethodResult = (*env)->CallStringMethod(env,instance, instanceMethodId);
(2)调用静态方法
CallStatic<Type>Field
6.属性或类型的签名
如上我们
jstring staticField;
staticField = (*env)->GetStaticObjectField(env, clazz, staticFieldId);
其中staticFieldId是指定java中的类型的,这样系统才知道我们从java中拿了什么样的数据
就像
staticMethodId = (*env)->GetStaticMethodID(env, clazz,"staticMethod", "()Ljava/lang/String;");
告诉系统返回String
其实说了这么多,你只要明白,对于属性类型,他就要有个可以形容这个是什么类型属性的描述,而方法就用签名描述,我们可以使用javap
看看我们java对象的属性和方法的签名