Java与JNI类型转换,方法调用
来源:互联网 发布:数据库管理器 编辑:程序博客网 时间:2024/05/20 23:08
算是Java和JNI的数据类型转换和方法的调用,算是基本工具类吧,没有详细整理。
//// Created by hongzhen on 2017/11/24.///* DO NOT EDIT THIS FILE - it is machine generated */#include <android/log.h>#include <stdio.h>#include "../include/hongzhen_com_jnitypeturn_JNITypeTurnUtils.h"/* Header for class wentsai_hisign_com_testlibrary_TestUtils */#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,"Yu" ,__VA_ARGS__) // 定义LOGI类型#ifdef __cplusplusextern "C" {#endiftypedef struct TestBean{ unsigned char isBoolen; char isByte; char isChar; short isShort; int isInt; long isLong; float isFloat; double isDouble; char *isString; unsigned char *isBoolens; char *isBytes; char *isChars ; short *isShorts; int *isInts; long *isLongs; float *isFloats; double *isDoubles;} *testBean;/*JNIEXPORT void JNICALL Java_wentsai_hisign_com_testlibrary_TestUtils_getStudent (JNIEnv *env, jclass jclas, jobject jobj) { jclass js = (*env)->GetObjectClass(env, jobj); jfieldID jidname = (*env)->GetFieldID(env, js, "name", "Ljava/lang/String;"); jstring jstr = (*env)->GetObjectField(env, jobj, jidname); char *name = (*env)->GetStringUTFChars(env, jstr, NULL); LOGI("Name----%s", name); jfieldID jidage = (*env)->GetFieldID(env, js, "age", "I"); jint age = (*env)->GetIntField(env, jobj, jidage); LOGI("Age----%d", age); jmethodID jmid_say = (*env)->GetMethodID(env, js, "say", "()V"); (*env)->CallVoidMethod(env, jobj, jmid_say); jstring new_jstr = (*env)->NewStringUTF(env, "LiTang"); (*env)->SetObjectField(env,jobj,jidname,new_jstr);}*/void Jni2Java(JNIEnv *env, jobject jobj){ //Jni类型转Java类型 jclass jclas = (*env)->GetObjectClass(env, jobj); //-------------------------------------------------------- //boolean型变量 jfieldID fid_boolean = (*env)->GetFieldID(env, jclas, "isBoolen", "Z"); jboolean jb =JNI_FALSE; (*env)->SetBooleanField(env,jobj,fid_boolean,jb); //-------------------------------------------------------- //byte型变量 isByte jfieldID fid_byte = (*env)->GetFieldID(env, jclas, "isByte", "B"); jbyte my_byte=44; (*env)->SetByteField(env,jobj,fid_byte,my_byte); //-------------------------------------------------------------------------- //char/short/float/double/long/与上面的一样 //-------------------------------------------------------------------------- //string jfieldID fid_string = (*env)->GetFieldID(env, jclas, "isString", "Ljava/lang/String;"); jstring jstr=(*env)->NewStringUTF(env,"王佳");; (*env)->SetObjectField(env,jobj,fid_string,jstr); //------------------------------------------------------------------------------------- //byte[] //获取fieldID jfieldID fid_bytes=(*env)->GetFieldID(env,jclas,"isBytes","[B"); //准备数据 char my_bytes[5]={1,2,3,4,5}; //创建jbyteArray jbyteArray my_byte_arrsy=(*env)->NewByteArray(env,5); //将数据放入到jbyteArray (*env)->SetByteArrayRegion(env,my_byte_arrsy,0,5,my_bytes); //将jbyteArray存入到对应类的变量中 (*env)->SetObjectField(env,jobj,fid_bytes,my_byte_arrsy); //-------------------------------------------------------------------------------------- //int[] jfieldID jid_int_array=(*env)->GetFieldID(env,jclas,"isInts","[I"); int my_ints[5]={11,22,3,34,35}; jintArray my_int_array=(*env)->NewIntArray(env,5); (*env)->SetIntArrayRegion(env,my_int_array,0,5,my_ints); (*env)->SetObjectField(env,jobj,jid_int_array,my_int_array);}/** * Java类型的变量向jni类型转换 * @param env * @param jobj */void java2Jni(JNIEnv *env, jobject jobj) { //Java类型转jni类型 jclass jclas = (*env)->GetObjectClass(env, jobj); //-------------------------------------------------------- //boolean型变量 jfieldID fid_boolean = (*env)->GetFieldID(env, jclas, "isBoolen", "Z"); if (fid_boolean == NULL) { LOGI("Boolen---%s", "null"); } jboolean jbool = (*env)->GetBooleanField(env, jobj, fid_boolean); if (jbool) { LOGI("Boolen---%s", "true"); } //-------------------------------------------------------- //byte型变量 isByte jfieldID fid_byte = (*env)->GetFieldID(env, jclas, "isByte", "B"); if (fid_byte == NULL) { LOGI("Byte---%s", "null"); } jbyte jfield_byte = (*env)->GetByteField(env, jobj, fid_byte); LOGI("Byte---%d", jfield_byte); char c_char=jfield_byte; LOGI("c_char---%d", c_char);//存储的是数值,以%d输出,如果以%c输出会没有结果 //-------------------------------------------------------------------- //char型变量 jfieldID fid_char = (*env)->GetFieldID(env, jclas, "isChar", "C"); if (fid_char == NULL) { LOGI("Byte---%s", "null"); } jchar jfield_char = (*env)->GetCharField(env, jobj, fid_char); LOGI("Byte---%c", jfield_char); char c_char1=jfield_char; LOGI("c_char1---%c", c_char1); //----------------------------------------------------------------------------- //Short jfieldID fid_short = (*env)->GetFieldID(env, jclas, "isShort", "S"); jshort jfield_shor=(*env)->GetShortField(env,jobj,fid_short); LOGI("Short---%d", jfield_shor); //------------------------------------------------------------------------------- //int jfieldID fid_int=(*env)->GetFieldID(env,jclas,"isInt","I"); jint jfield_ing=(*env)->GetIntField(env,jobj,fid_int); LOGI("Int---%d", jfield_ing); //------------------------------------------------------------------------------- //long jfieldID fid_long=(*env)->GetFieldID(env,jclas,"isLong","J"); if (fid_long==NULL){ LOGI("Long---%s", "null"); } jlong jfield_long=(*env)->GetLongField(env,jobj,fid_long); LOGI("Long---%ld", jfield_long); //---------------------------------------------------------------------------------- //float jfieldID fid_float=(*env)->GetFieldID(env,jclas,"isFloat","F"); jfloat jfield_float=(*env)->GetFloatField(env,jobj,fid_float); LOGI("Float---%f", jfield_float); //----------------------------------------------------------------------------------- //double jfieldID fid_double=(*env)->GetFieldID(env,jclas,"isDouble","D"); jdouble jfield_double=(*env)->GetDoubleField(env,jobj,fid_double); LOGI("Double---%f", jfield_double); //------------------------------------------------------------------------------------- //String jfieldID fid_string = (*env)->GetFieldID(env, jclas, "isString", "Ljava/lang/String;"); jstring jfield_string = (*env)->GetObjectField(env, jobj, fid_string); char *name = (*env)->GetStringUTFChars(env, jfield_string, NULL); LOGI("String----%s", name); //------------------------------------------------------------------------------------- //byte[] jfieldID fid_bytes=(*env)->GetFieldID(env,jclas,"isBytes","[B"); jbyteArray jfield_byte_array=(*env)->GetObjectField(env,jobj,fid_bytes); int size=(*env)->GetArrayLength(env,jfield_byte_array); //GetByteArrayRegion--进行值拷贝,将Java端数组的数据拷贝到本地的数组中 char arr[size]; (*env)->GetByteArrayRegion(env,jfield_byte_array,0,size,arr); int i; for ( i = 0; i < size; ++i) { LOGI("Byte---%d", arr[i]); } //GetByteArrayElements--指针的形式,将本地的数组指针直接指向Java端的数组地址,其实本质上是JVM在 // 堆上分配的这个数组对象上增加一个引用计数,保证垃圾回收的时候不要释放,从而交给本地的指针使用, // 使用完毕后指针一定要记得通过ReleaseByteArrayElements进行释放,否则会产生内存泄露 jbyte *byte_array=(*env)->GetByteArrayElements(env,jfield_byte_array,JNI_FALSE); int j; for ( j = 0; j < size; ++j) { LOGI("Byte---%d", *byte_array); byte_array++; } (*env)->ReleaseByteArrayElements(env,jfield_byte_array,byte_array,JNI_COMMIT); //-------------------------------------------------------------------------------------- //int[] jfieldID jid_int_array=(*env)->GetFieldID(env,jclas,"isInts","[I"); jintArray jfield_int_array=(*env)->GetObjectField(env,jobj,jid_int_array); int size_int=(*env)->GetArrayLength(env,jfield_int_array); //GetByteArrayRegion--进行值拷贝,将Java端数组的数据拷贝到本地的数组中 int ints[size_int]; (*env)->GetIntArrayRegion(env,jfield_int_array,0,size_int,ints); int a; for ( a = 0; a < size_int; ++a) { LOGI("Ints---%d", ints[i]); } //GetByteArrayElements--指针的形式,将本地的数组指针直接指向Java端的数组地址,其实本质上是JVM在 // 堆上分配的这个数组对象上增加一个引用计数,保证垃圾回收的时候不要释放,从而交给本地的指针使用, // 使用完毕后指针一定要记得通过ReleaseByteArrayElements进行释放,否则会产生内存泄露 jint *int_array=(*env)->GetIntArrayElements(env,jfield_int_array,JNI_FALSE); int s; for ( s = 0; s < size_int; ++s) { LOGI("Ints---%d", *int_array); int_array++; } (*env)->ReleaseIntArrayElements(env,jfield_int_array,int_array,JNI_COMMIT); //--------------------------------------------------------------------------------- //其他类型的数组转换,跟byte[] ,int[]是一样的 //对应签名:Object[]-[Ljava/lang/object; // boolean[]-[B} // char[]-[C // short[]-[S // long[]-[J // float[]-[F // double[]-[D //--------------------------------------------------------------------------------------- //访问静态属性 jfieldID jfid=(*env)->GetStaticFieldID(env,jclas,"staticInt","I"); jint statcInt=(*env)->GetStaticIntField(env,jclas,jfid); LOGI("静态属性%d",statcInt); //--------------------------------------------------------------------------------------- //访问Java方法 jmethodID methid=(*env)->GetMethodID(env,jclas,"getIsInt","()I"); jint result=(*env)->CallIntMethod(env,jobj,methid); LOGI("普通方法%d",result); //--------------------------------------------------------------------------------------- //访问Java静态方法 jmethodID md=(*env)->GetStaticMethodID(env,jclas,"getAge","()I"); jint age=(*env)->CallStaticIntMethod(env,jclas,md); LOGI("静态方法%d",age);}JNIEXPORT void JNICALL Java_hongzhen_com_jnitypeturn_JNITypeTurnUtils_getTest (JNIEnv *env, jclass jclas, jobject jobj){ java2Jni(env,jobj); Jni2Java(env,jobj);}#ifdef __cplusplus}#endif
阅读全文
0 0
- Java与JNI类型转换,方法调用
- JNI中Java与C++的类型转换与相互调用
- Java运算符顺序: 强制类型转换与调用方法
- Andoird jni 调用类型转换
- Andoird jni 调用类型转换
- JNI调用Java方法
- JNI调用Java方法
- JNI调用Java方法
- JNI调用Java方法
- JNI调用Java方法
- JNI调用Java方法
- NDK编程:JNI与Java,C++字符类型转换
- Java JNI 调用C#方法
- java调用dll方法--JNI
- jni - c 调用java方法
- java强制类型转换后调用方法加括号
- java类型转换方法
- java native interface JNI 调用Java方法
- 蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别
- Binary Sorting Tree_Cosmetics_v1.0
- 处理机调度算法
- JavaWeb学习笔记-XML-8
- 171127 Linux tensorboard
- Java与JNI类型转换,方法调用
- # 与 $ 区别以及 sql 预编译
- SVM中的训练算法:序列最小最优化算法SMO的读书笔记
- code forces Help Vasilisa the Wise 2
- LeetCode 分类练习(5)—— 链表相关习题(1)
- 关于storyboard和xib创建控制器
- Jackson学习二之集合类对象与JSON互相转化
- 环形队的基本操作(C语言)
- MyBatis之statementType="STATEMENT"的使用