JNI程序如何进行参数传递

本文详细介绍了JNI程序中如何传递Java的基本类型、String以及数组类型的参数和返回值。Java的基本类型可以直接映射为JNI类型,String需要通过GetStringUTFChars和NewStringUTF函数处理,而数组则利用GetArrayLength和GetIntArrayElements等函数进行操作。

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

作者:朱金灿
来源:clever101的专栏

JNI程序如何传递常用参数和返回值

   由于JNI程序涉及到Java程序和C++程序的交互,因此需要考虑如何传递常用参数和返回值。

Java数据类型与JNI类型映射

   Java中的基本类型包括boolean,byte,char,short,int,long,float,double,如果你用这几种类型做native方法的参数,当你通过javah工具生成.h文件的时候,这些基本类型分别对应的类型是 jboolean,jbyte,jchar,jshort,jint,jlong,jfloat,jdouble。因此基本类型的传递是可以直接传递的。下面是详细的Java数据类型与jni类型映射表:

Java类型本地类型描述
booleanjbooleanC/C++8位整型
bytejbyteC/C++带符号的8位整型
charjcharC/C++无符号的16位整型
shortjshortC/C++带符号的16位整型
intjintC/C++带符号的32位整型
longjlongC/C++带符号的64位整型
floatjfloatC/C++32位浮点型
doublejdoubleC/C++64位浮点型
Objectjobject任何Java对象,或者没有对应java类型的对象
ClassjclassClass对象
Stringjstring字符串对象
Object[]jobjectArray任何对象的数组
boolean[]jbooleanArray布尔型数组
byte[]jbyteArray比特型数组
char[]jcharArray字符型数组
short[]jshortArray短整型数组
int[]jintArray整型数组
long[]jlongArray长整型数组
float[]jfloatArray浮点型数组
double[]jdoubleArray双浮点型数组

String参数的传递和返回

   Java的String和C++的string是不能对等起来的,所以需要额外进行处理。具体就是使用GetStringUTFChars函数将jstring类型变成一个char*类型,返回的时候,要生成一个jstring类型的对象,也必须通过NewStringUTF函数来构造。下面是示例代码:

JNIEXPORT jstring JNICALL Java_com_developerworks_HelloJNI_getLine
(JNIEnv* env, jobject obj, jstring prompt)
{
	const char* str;
	str = env->GetStringUTFChars(prompt, false);
	if (str == NULL) 
	{
		return NULL; /* OutOfMemoryError already thrown */
	}

	std::cout<<str<<std::endl;
	env->ReleaseStringUTFChars(prompt, str);
	char* tmpstr = "return string succeeded";
	jstring rtstr = env->NewStringUTF(tmpstr);

	return rtstr;
}

数组类型的传递

  和String一样,JNI为Java基本类型的数组提供了jArray类型,比如int[]对应的就是jintArray。来看一个传递int数组的例子,具体是用GetArrayLength函数来获取数组的长度,使用GetIntArrayElements函数将jintArray转换为jint类型。下面是示例代码:

JNIEXPORT jint JNICALL Java_com_developerworks_HelloJNI_sumArray
(JNIEnv *env, jobject obj, jintArray arr)
{
	jint* carr = NULL;
	carr = env->GetIntArrayElements(arr, false);
	if (carr == NULL) 
	{
		return 0; /* exception occurred */
	}
	int size = env->GetArrayLength(arr);
	jint sum = 0;
	for (int i = 0; i < size; i++)
	{
		sum += carr[i];
	}
	env->ReleaseIntArrayElements(arr, carr, 0);
	return sum;
}

   后续支持或需要示例代码,请添加VX: explorer101

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clever101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值