<noscript></noscript>
JNI和C++中的String相互转换
Uper
目前仍在继续先前的工作,这两天一直在折腾jstring 和char* 之间是如何转换的。在网上找了些例子和张孝祥jni的视频,现把自己成功运行例子贴出来。
//jstring to char*
char* jstringTostring(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("utf-8");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > 0)
{
rtn = (char*)malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0);
return rtn;
}
//char* to jstring
jstring stoJstring(JNIEnv* env, const char* pat)
{
jclass strClass = env->FindClass("Ljava/lang/String;");
jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
jbyteArray bytes = env->NewByteArray(strlen(pat));
env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
jstring encoding = env->NewStringUTF("utf-8");
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}
//invoke function
JNIEXPORT jstring JNICALL Java_test_cs_web_SWIFTAlianceCASmfTest_strcal
(JNIEnv *env, jclass obj, jstring jstr1, jstring jstr2)
{
jbyteArray bytes = 0;
jthrowable exc;
char *pszResult = NULL;
char *pszSTR1 = NULL;
char *pszSTR2 = NULL;
pszSTR1 = jstringTostring(env, jstr1);
pszSTR2 = jstringTostring(env, jstr2);
int nlen = sizeof(char)*(strlen(pszSTR1)+strlen(pszSTR2));
pszResult = (char*)malloc(nlen);
strcpy(pszResult, pszSTR1);
strcat(pszResult, pszSTR2);
jstring jstrRe = stoJstring(env, pszResult);
free(pszSTR1);
free(pszSTR2);
free(pszResult);
return(jstrRe);
}
Note: 函数中间有一些签名的定义,不是很好理解。细节请参考sun的jni文档介绍or command javap
相关推荐
在标题“JNI 调 C/C++ 参数String”中,我们将探讨如何通过JNI传递Java的String类型参数到C或C++函数,并在本地代码中进行处理。 首先,让我们了解JNI的基本结构。要使用JNI,你需要创建一个Java类,声明一些 ...
对于String对象的处理,JNI提供了`NewStringUTF`函数来创建一个新的Java String对象,以及`GetStringUTFChars`和`ReleaseStringUTFChars`来获取和释放字符串的UTF-8表示。例如,你可能需要在本地代码中解析或修改...
在JNI中,我们可以使用C++或C语言编写本地方法,这些本地方法可以直接访问和操作Java对象,包括传递参数和接收返回值。在涉及到C++和Java之间的参数传递时,有一些特定的规则和技巧需要注意。 首先,我们要理解Java...
本教程将深入探讨如何使用 JNI 实现 Java 和 C++ 之间的互相调用,以及如何处理不同类型的数据。 首先,我们需要理解 JNI 的基本概念。JNI 是一个接口,它定义了一套函数,这些函数在 JVM(Java 虚拟机)内部提供对...
本主题将深入探讨如何通过JNI来调用C++和Delphi中编译生成的DLL动态链接库。 1. **JNI基础** JNI是Java平台的核心组件之一,它为Java应用程序提供了一个桥梁,使其能够与本地代码交互。JNI提供了一系列的函数接口...
在C++中,你可以创建一个函数来处理这种转换,并通过JNI的`NewObject`和`GetObjectField`等函数获取Java对象的字段值。 总的来说,JNI提供了一种灵活的方式来连接Java和C++代码,允许开发者充分利用两种语言的优点...
`Student`对象在C++中没有直接对应的类型,因此我们需要使用JNI的`jobject`和类型转换。例如: ```cpp extern "C" JNIEXPORT void JNICALL Java_com_kevin_ndk08_code_as_MainActivity_putObject( JNIEnv *env, ...
在Android应用开发中,JNI(Java Native Interface)是一种让Java代码和本地(C/C++)代码交互的技术。本文将深入探讨如何在Android的JNI中处理中文字符传递的问题,这是一个非常实用且重要的技能,特别是在需要高...
5. **数据类型转换**:JNI提供了一套映射机制,用于在C++和Java之间转换数据类型。例如,Java的`int`对应C++的`jint`,`String`对应`jstring`,`ArrayList`对应` jobjectArray`等。 6. **动态链接库编译**:将C++...
在上述过程中,需要注意Java和C++的数据类型转换,因为它们之间存在差异。例如,Java的`int`在JNI中是`jint`,`String`是`jstring`。对于复杂类型,如数组或对象,需要使用特定的JNI函数进行处理。 在提供的资源...
在JNI环境中,处理Java的`String`类型尤其需要注意,因为其在C/C++中表现为`char*`形式。 1. **从Java到C/C++**: 当Java传递一个`String`至C/C++时,首先会转换为`jstring`。若需进一步处理,则可将其转换为`char...
总结:使用JNI调用C++库的过程涉及Java和C++的协同工作,包括Java环境配置、JNI接口设计、头文件生成、C++源码编写、编译生成DLL以及在Java中加载和调用。整个过程需要对两种语言都有一定的了解,但通过这种方式,...
Android JNI(Java Native Interface)编程是Android开发中的一个重要部分,它允许Java代码和其他语言(如C/C++)编写的代码进行交互。JNI在Android平台上扮演着桥梁的角色,使得开发者能够利用C/C++的强大性能和...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他...通过这个教程,你可以掌握使用JNI调用本地接口并处理中文字符的核心技术,这对于需要混合Java和C/C++开发的项目来说是非常有价值的。
在Android中,当你需要在C/C++代码中创建Java字符串对象时,可以使用JNI提供的函数`NewString`。这个函数接受两个参数:一个`jchar`类型的数组,以及数组的长度。`jchar`是JNI中的一个类型,它对应于Java中的`char`...
JNI(Java Native Interface)是Java平台提供的一种标准接口,它允许Java代码和其他语言写的代码进行交互,特别...通过学习这些文档,开发者将能够熟练地在JNI环境中处理包含中文的字符串,实现Java和C/C++的无缝交互。
在Java中,可以使用`getBytes`和`new String`配合指定编码进行转换;在C++中,通常需要手动处理编码转换,可能需要用到第三方库如iconv等。 总之,Java和C++通过Socket通信时,要确保双方对字符编码的一致性,避免...
在Android开发中,有时我们需要利用高性能的C++库来处理图像或者进行计算密集型任务,OpenCV是一个广泛使用的计算机视觉库,提供了丰富的图像处理和计算机视觉功能。JNI(Java Native Interface)则是Java平台用于...
JNI提供了多种数据类型映射方式,使得Java数据类型能够与C/C++数据类型相互转换。 #### 方法签名 在JNI中,每个本地方法都有一个特定的签名,用于指示方法的返回类型、参数类型及其顺序。例如,一个带有整型参数的...