`
yutiansky
  • 浏览: 198157 次
  • 性别: Icon_minigender_1
  • 来自: 本溪
社区版块
存档分类
最新评论

jstring, String, char* 变换函数

JNI 
阅读更多
#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); 
}
 
分享到:
评论

相关推荐

    char *转 jstring

    C++调用java java调用C++ 字符串参数传递 类型的转换

    android jni jstring

    2. **转换为C字符串**:使用`env-&gt;GetStringUTFChars()`函数,可以将`jstring`转换为可读写的C风格字符串(`char*`)。这个过程需要注意内存管理,因为`GetStringUTFChars()`返回的指针需要在使用完毕后释放,通过`...

    ffmpeg编译的android可用的so文件,多个版本

    jstring string=(*env)-&gt;GetObjectArrayElement(env,cmdline,i); const char* tmp=(*env)-&gt;GetStringUTFChars(env,string,0); argv[i]=(char*)malloc(sizeof(char)*1024); strcpy(argv[i],tmp); } ffmpeg...

    jni数据类型转换

    2. **C/C++ char*到JString**: ``` jstring jstr = env-&gt;NewStringUTF(charStr); ``` #### 结论 JNI的数据类型转换是实现Java与本地代码交互的关键环节。掌握这些转换方法,不仅能提高跨语言编程的效率,还能...

    android jni常用函数详解

    - **jstring**: Java字符串对象的句柄。 - **jclass**: Java类的句柄。 - **jmethodID**: Java方法标识符。 - **jfieldID**: Java字段标识符。 #### 三、JNI数据类型映射 JNI定义了一组基本数据类型,这些类型对应...

    JNI学习二:字符串参数传递与返回值

    这个函数接受`JNIEnv`指针、`jobject`(Java对象的引用)和`jstring`(Java字符串)作为参数,并返回一个`jstring`。注意,字符串在Java和C/C++之间的处理方式不同: ```c++ #include "JNITest.h" JNIEXPORT ...

    JNI文档资料源码_2020_01_28_2.zip

    【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 ) ... 字符串转换 ( jstring -&gt; char* ) VI . 字符串释放 VII . 部分代码示例

    jni使用string相互调用

    jni使用string相互调用 Java 传递 String 给C C 传递 jstring 给 Java

    jni 构造字符串

    `NewString`函数接受C风格的字符串和其长度,然后返回一个`jstring`类型的引用。如果内存不足,`NewString`可能会返回`NULL`,此时需要检查并抛出异常。 注意,当使用`NewString`时,输入的字符串必须是Unicode编码...

    java与c++交互(JNI学习笔记)

    - Java 的 `String` 对应于 C/C++ 的 `jstring` 类型,表示Java字符串的引用。 #### 二、C/C++ 中 jclass 获取 JNI 提供了一些基本的函数来获取 Java 类 (`jclass`) 的引用。这些函数主要定义在 `jni.h` 头文件中...

    android JNI机制分析

    - `String` 映射为 `jstring` 或 `Ljava/lang/String` #### 二、Java层与C++层的数据传递 在JNI中,Java层和C++层可以通过特定的方法进行数据传递。例如,当需要获取Java类中的成员变量时,可以通过以下步骤: 1...

    最全的JNI书稿统稿.rar

    开发者需要理解如何在Java和C/C++之间转换数据,如`jint`对应Java的`int`,`jstring`对应Java的`String`。 6. **调用Java方法**:JNI支持静态和实例方法的调用。对于实例方法,使用`CallVoidMethod`系列函数;对于...

    Android NDK 学习

    - 使用`JNIEnv`的`GetStringUTFChars`函数获取JavaString的UTF-8编码形式的字符数组。这个函数会返回一个指向字符数组的指针,并且需要传递一个布尔值指针,用来记录字符串是否已经被释放。 - 在C++中,你可以使用...

    jni环境搭建

    const char *str = (const char *)env-&gt;GetStringUTFChars(instring, JNI_FALSE); printf("%s\n", str); env-&gt;ReleaseStringUTFChars(instring, str); return; } JNIEXPORT void JNICALL Java_...

    JNI 调 C C++ 参数String

    在标题“JNI 调 C/C++ 参数String”中,我们将探讨如何通过JNI传递Java的String类型参数到C或C++函数,并在本地代码中进行处理。 首先,让我们了解JNI的基本结构。要使用JNI,你需要创建一个Java类,声明一些 ...

    魔兽1.24E内置字符串转换函数 以及 查找方法

    - `StringToChar`:将`JString`的第一个字符转换为`char`。 2. **C的`char`类型处理**: - 在JASS中,通常不直接处理C语言的`char`数组,而是通过`JString`来间接操作。然而,如果你需要与C/C++编写的库交互,...

    android 下c访问app的sqite数据库

    在Java层,你可以通过`Context.getDatabasePath(String name)`方法获取到数据库文件的完整路径,然后传递给C层。在JNI中,可以定义一个函数接收Java层传来的字符串参数: ```c++ extern "C" JNIEXPORT void ...

    jni数值传递

    JNIEXPORT jstring JNICALL Java_JniDemo_passString(JNIEnv *env, jobject obj, jstring strJava) { const char *strChars = env-&gt;GetStringUTFChars(strJava, NULL); // 使用strChars,记住在使用完后释放它 ...

    android jni使用字符串

    const char* strChars = env-&gt;GetStringUTFChars(jstring, NULL); ``` 这里的`jstring`参数是我们从Java层传递过来的字符串对象,而`NULL`参数表示我们不关心是否需要释放这些字符。获取到UTF-8字符后,可以进行...

    android jni使用libzip读取压缩文件

    public native void readZipFromAssets(String zipName, String fileName); ``` 然后,使用`javah`命令生成对应的C/C++头文件,这个头文件将定义JNI函数原型。 接下来,在C/C++代码中实现`readZipFromAssets`函数...

Global site tag (gtag.js) - Google Analytics