JNI程序如何进行参数传递

作者:朱金灿
来源: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JNIJava Native Interface)是 Java 虚拟机 (JVM) 提供的一种机制,用于在 Java 代码和本地代码(C/C++)之间进行交互。因此,在 JNI进行网络请求和数据提交可以使用本地代码实现,比如使用 C 或 C++ 的网络来完成请求和提交。 在 JNI进行 post 提交,需要以下步骤: 1. 在本地代码中引入网络,例如 libcurl。 2. 实现 JNI 接口方法,该方法将会被 Java 代码调用。 3. 在 JNI 方法中使用网络进行 post 提交。 4. 将提交结果返回给 Java 代码。 下面是一个简单的 JNI post 提交示例: ```c #include <jni.h> #include <curl/curl.h> JNIEXPORT jstring JNICALL Java_com_example_MyClass_postData(JNIEnv *env, jobject obj, jstring url, jstring data) { CURL *curl; CURLcode res; const char *post_url = (*env)->GetStringUTFChars(env, url, NULL); const char *post_data = (*env)->GetStringUTFChars(env, data, NULL); char *response = malloc(1024); curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, post_url); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_data); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, response); res = curl_easy_perform(curl); curl_easy_cleanup(curl); } curl_global_cleanup(); (*env)->ReleaseStringUTFChars(env, url, post_url); (*env)->ReleaseStringUTFChars(env, data, post_data); return (*env)->NewStringUTF(env, response); } size_t write_callback(void *ptr, size_t size, size_t nmemb, void *userdata) { sprintf(userdata, "%s%s", (char*) userdata, (char*) ptr); return size * nmemb; } ``` 这里实现了一个名为 `postData` 的 JNI 方法,该方法接收两个参数:`url` 和 `data`,分别表示提交的地址和数据。在该方法中,我们使用 libcurl 进行 post 提交,并将提交结果保存在 `response` 变量中。最后,将 `response` 转换为 jstring 类型,并返回给 Java 代码。 需要注意的是,在 JNI 中需要对递的 jstring 对象进行释放。在这个示例中,我们使用了 `ReleaseStringUTFChars` 方法来释放 `url` 和 `data` 对象,以及在 `write_callback` 函数中释放 `userdata` 对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

clever101

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

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

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

打赏作者

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

抵扣说明:

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

余额充值