JNI 总结

jni引用类型
与基本数据类型不同,引用类型对原生方法是不透明的,它们内部的数据结构并不直接向原生代码公开 

Java类型  原生类型
java.lang.Class jclass
java.lang.Throwable jthorwable
java.lang.String    jstring
Other objects   jobjects
java.lang.Object[]  jobjectArray
boolean[]   jbooleanArray
byte[]  jbooleanArray
char[]  jcharArray
short[] jshortArray
int[]   jintArray
long[]  jlongArray
float[] jfloatArray
double[]    jdoubleArray
Other arrays    Jarray

jni中基础类型

基础类型是typedef 从c类型定义的
jni类型和c类型一致

基本数据类型可以直接与C/C++的相应基本数据类型映射,JNI用类型定义使得这种映射对开发人员透明 

Java类型 JNI类型      C/C++类型    大小
Boolean Jblloean     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位
 
字符串

jboolean b = false;
const char* pop_char = env->GetStringUTFChars(pop_file, &b);

数组
1、一维数组 jdoubleArray xy
jdouble* para_data = env->GetDoubleArrayElements(para_array, NULL);
2、二维数组
参数类型  jobjectArray jobjarr
jint rows = env->GetArrayLength(jobjarr);
for (int i = 0; i < rows; i++)
{
jdoubleArray jniarray = (jdoubleArray)env->GetObjectArrayElement(jobjarr, i);
jdouble*coldata = env->GetDoubleArrayElements(jniarray, NULL);
data_x[i] = coldata[0];
data_y[i] = coldata[1];
data_z[i] = coldata[2];
env->ReleaseDoubleArrayElements(jniarray, coldata, 0);

}
3、返回一维数组 jdoubleArray
jdoubleArray newIntArray = env->NewDoubleArray(3);
jdouble fill[3];
for (int i = 0; i < 3; i++) {
    fill[i] = result[i]; // put whatever logic you want to populate the values here.
}
//把jint指针中的元素设置到jintArray对象中
env->SetDoubleArrayRegion(newIntArray, 0, 3, fill);
4、返回二维数组 jobjectArray
jobjectArray returnjArr;
jclass doubleArr = env->FindClass("[D");
returnjArr = env->NewObjectArray(rows, doubleArr, NULL);
for (int i = 0; i < rows; i++)
{
    jdoubleArray colArr = env->NewDoubleArray(3);
    jdouble fill[3];
    for (int j = 0; j < 3; j++) {
           fill[j] = result[i][j];
       }
    env->SetDoubleArrayRegion(colArr, 0, 3, fill);
    env->SetObjectArrayElement(returnjArr, i, colArr);
    env->DeleteLocalRef(colArr);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容