#include <malloc.h>
#include <string.h>
#include <stdlib.h>
#include <vcclr.h>
using namespace System;
using namespace System::Text;
// jstring To String
String^ jstringToStr(JNIEnv* env, jstring jstr)
{
char* str = jstringTostring(env, jstr);
String^ value = gcnew String(str);
free(str);
return value;
}
// 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;
}
// String To jstring
jstring strTojstring(JNIEnv* env, String^ rtn)
{
pin_ptr<const wchar_t> wch = PtrToStringChars(rtn);
size_t convertedChars = 0;
size_t sizeInBytes = ((rtn->Length + 1) * 2);
char *ch = (char *)malloc(sizeInBytes);
errno_t err = wcstombs_s(&convertedChars,
ch, sizeInBytes,
wch, sizeInBytes);
jstring js = stringTojstring(env, ch);
free(ch);
return js;
}
// char* To jstring
jstring stringTojstring(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);
}
std::string jstring2str(JNIEnv* env, jstring jstr)
{
char
* rtn = NULL;
jclass clsstring = env->FindClass(
"java/lang/String"
);
jstring strencode = env->NewStringUTF(
"GB2312"
);
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
);
std::string stemp(rtn);
free(rtn);
return
stemp;
}
转自:http://dncsoft.iteye.com/blog/1010213
http://www.cnblogs.com/lichien/archive/2011/10/11/2206828.html
相关推荐
C++调用java java调用C++ 字符串参数传递 类型的转换
2. **转换为C字符串**:使用`env->GetStringUTFChars()`函数,可以将`jstring`转换为可读写的C风格字符串(`char*`)。这个过程需要注意内存管理,因为`GetStringUTFChars()`返回的指针需要在使用完毕后释放,通过`...
2. **C/C++ char*到JString**: ``` jstring jstr = env->NewStringUTF(charStr); ``` #### 结论 JNI的数据类型转换是实现Java与本地代码交互的关键环节。掌握这些转换方法,不仅能提高跨语言编程的效率,还能...
jstring string=(*env)->GetObjectArrayElement(env,cmdline,i); const char* tmp=(*env)->GetStringUTFChars(env,string,0); argv[i]=(char*)malloc(sizeof(char)*1024); strcpy(argv[i],tmp); } ffmpeg...
- **jstring**: Java字符串对象的句柄。 - **jclass**: Java类的句柄。 - **jmethodID**: Java方法标识符。 - **jfieldID**: Java字段标识符。 #### 三、JNI数据类型映射 JNI定义了一组基本数据类型,这些类型对应...
jni使用string相互调用 Java 传递 String 给C C 传递 jstring 给 Java
这个函数接受`JNIEnv`指针、`jobject`(Java对象的引用)和`jstring`(Java字符串)作为参数,并返回一个`jstring`。注意,字符串在Java和C/C++之间的处理方式不同: ```c++ #include "JNITest.h" JNIEXPORT ...
开发者需要理解如何在Java和C/C++之间转换数据,如`jint`对应Java的`int`,`jstring`对应Java的`String`。 6. **调用Java方法**:JNI支持静态和实例方法的调用。对于实例方法,使用`CallVoidMethod`系列函数;对于...
- 使用`JNIEnv`的`GetStringUTFChars`函数获取JavaString的UTF-8编码形式的字符数组。这个函数会返回一个指向字符数组的指针,并且需要传递一个布尔值指针,用来记录字符串是否已经被释放。 - 在C++中,你可以使用...
【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 ) ... 字符串转换 ( jstring -> char* ) VI . 字符串释放 VII . 部分代码示例
- `StringToChar`:将`JString`的第一个字符转换为`char`。 2. **C的`char`类型处理**: - 在JASS中,通常不直接处理C语言的`char`数组,而是通过`JString`来间接操作。然而,如果你需要与C/C++编写的库交互,...
`NewString`函数接受C风格的字符串和其长度,然后返回一个`jstring`类型的引用。如果内存不足,`NewString`可能会返回`NULL`,此时需要检查并抛出异常。 注意,当使用`NewString`时,输入的字符串必须是Unicode编码...
- `String` 映射为 `jstring` 或 `Ljava/lang/String` #### 二、Java层与C++层的数据传递 在JNI中,Java层和C++层可以通过特定的方法进行数据传递。例如,当需要获取Java类中的成员变量时,可以通过以下步骤: 1...
- Java 的 `String` 对应于 C/C++ 的 `jstring` 类型,表示Java字符串的引用。 #### 二、C/C++ 中 jclass 获取 JNI 提供了一些基本的函数来获取 Java 类 (`jclass`) 的引用。这些函数主要定义在 `jni.h` 头文件中...
const char *str = (const char *)env->GetStringUTFChars(instring, JNI_FALSE); printf("%s\n", str); env->ReleaseStringUTFChars(instring, str); return; } JNIEXPORT void JNICALL Java_...
在标题“JNI 调 C/C++ 参数String”中,我们将探讨如何通过JNI传递Java的String类型参数到C或C++函数,并在本地代码中进行处理。 首先,让我们了解JNI的基本结构。要使用JNI,你需要创建一个Java类,声明一些 ...
public native String sayHello(String name); public static void main(String[] args) { Main nativeObj = new Main(); String result = nativeObj.sayHello("JNI"); System.out.println(result); // 输出: ...
在Java层,你可以通过`Context.getDatabasePath(String name)`方法获取到数据库文件的完整路径,然后传递给C层。在JNI中,可以定义一个函数接收Java层传来的字符串参数: ```c++ extern "C" JNIEXPORT void ...
比如,将Java的`int`转换为C的`jint`,或者将C的`char*`转换为Java的`jstring`。 7. **异常处理**:C/C++代码可以通过`ExceptionOccurred`检查是否有Java异常发生,并通过`ExceptionDescribe`打印异常信息。如果...
因此在处理Java字符串时,需要将jstring对象转换为char*,然后转换为C++的std::string类型。完成操作后,还需要使用ReleaseStringUTFChars函数来释放资源。 示例代码如下: ```cpp const char* cstr = env->...