jni.h中定义了一些方法,用于类型间的转换

本文介绍了JNI中基本类型与Java类型之间的映射,并详细讲解了如何使用JNI提供的函数进行字符串及数组类型的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jni.h中定义了一些方法,用于类型间的转换---zz

(2011-11-18 22:41:32)
转载
标签:

杂谈

 
boolean byte char short int long float doublejava中的这几种类型,由命令生成jni中的响应类型:jbooleanjbytejcharjshortjintjlongjfloatjdouble,这些类型都是可以直接用的,比如直接打印出来,但是还有一些类型却不能直接使用,要使用这些类型,需要使用jni.h中定义的一些方法进行类型的转换,如将jstring转换为char*等。

随便介绍介个方法,更多的可以直接读jni.h源代码

用于将jstring转化为char*的方法,以及将char*转换会jstring类型的方法
static const char* GetStringUTFChars(JNIEnv* env, jstringjstr,
    jboolean* isCopy)
{
    JNI_ENTER();
    char* newStr;

    if (jstr == NULL) {
       
        newStr =NULL;
    } else {
        if (isCopy!= NULL)
            *isCopy =JNI_TRUE;

        StringObject* strObj = (StringObject*) dvmDecodeIndirectRef(env,jstr);
        newStr =dvmCreateCstrFromString(strObj);
        if (newStr== NULL) {
           
            dvmThrowException("Ljava/lang/OutOfMemoryError;",
                "native heap string alloc failed");
        }
    }

    JNI_EXIT();
    return newStr;
}

static jstring NewStringUTF(JNIEnv* env,const char* bytes)
{
    JNI_ENTER();

    jstring result;

    if (bytes == NULL) {
        result =NULL;
    } else {
       
        StringObject* newStr = dvmCreateStringFromCstr(bytes,ALLOC_DEFAULT);
        result =addLocalReference(env, (Object*) newStr);
        dvmReleaseTrackedAlloc((Object*)newStr, NULL);
    }

    JNI_EXIT();
    return result;
}

GetIntArrayElements ReleaseIntArrayElements 函数是 JNI 提供用于处理 int 数组的函数。如果试图用 arr[i] 的方式去访问 jintArray 类型,毫无疑问会出错。 JNI 还提供了另一对函数 GetIntArrayRegion ReleaseIntArrayRegion 访问 int 数组

1.      二维数组和String数组

JNI中,二维数组和String数组都被视为object数组,因为数组和String被视为object。仍然用一个例子来说明,这次是一个二维int数组,作为返回值。

JNIEXPORT jobjectArrayJNICALL Java_ObjectArrayTest_initInt2DArray(JNIEnv *env, jclasscls, int size)

{

jobjectArray result;

jclass intArrCls =env->FindClass("[I");

result = env->NewObjectArray(size,intArrCls, NULL);

for (int i = 0; i < size; i++){

jint tmp[256];

jintArray iarr =env->NewIntArray(size);

for(int j = 0; j < size; j++){

tmp[j] = i + j;

}

env->SetIntArrayRegion(iarr, 0,size, tmp);

env->SetObjectArrayElement(result,i, iarr);

env->DeleteLocalRef(iarr);

}

return result;

}

  上面代码中的第三行,

jobjectArray result;

  因为要返回值,所以需要新建一个jobjectArray对象。

jclass intArrCls =env->FindClass("[I");

  是创建一个jclass的引用,因为result的元素是一维int数组的引用,所以intArrCls必须是一维int数组的引用这一点是如何保证的呢?注意FindClass的参数" [I"JNI就是通过它来确定引用的类型的,I表示是int类型,[标识是数组。对于其他的类型,都有相应的表示方法,

Z boolean

B byte

C char

S short

I int

J long

F float

D double

String是通过“Ljava/lang/String;”表示的,那相应的,String数组就应该是“[Ljava/lang/String;”

  还是回到代码,

result = env->NewObjectArray(size,intArrCls, NULL);

  的作用是为result分配空间。

jintArray iarr =env->NewIntArray(size);

  是为一维int数组iarr分配空间。

env->SetIntArrayRegion(iarr, 0,size, tmp);

  是为iarr赋值。

env->SetObjectArrayElement(result,i, iarr);

  是为result的第i个元素赋值。

  通过上面这些步骤,我们就创建了一个二维int数组,并赋值完毕,这样就可以做为参数返回了。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值