`
我是老威
  • 浏览: 26415 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jstring, String, char* 变换函数【转】

 
阅读更多

#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

分享到:
评论

相关推荐

    char *转 jstring

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

    android jni jstring

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

    jni数据类型转换

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

    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...

    android jni常用函数详解

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

    jni使用string相互调用

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

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

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

    最全的JNI书稿统稿.rar

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

    Android NDK 学习

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

    JNI文档资料源码_2020_01_28_2.zip

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

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

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

    jni 构造字符串

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

    android JNI机制分析

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

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

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

    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类,声明一些 ...

    JNI开发步骤

    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); // 输出: ...

    android 下c访问app的sqite数据库

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

    Java-call-C.CPP.rar_C 调用java

    比如,将Java的`int`转换为C的`jint`,或者将C的`char*`转换为Java的`jstring`。 7. **异常处理**:C/C++代码可以通过`ExceptionOccurred`检查是否有Java异常发生,并通过`ExceptionDescribe`打印异常信息。如果...

    浅析Android NDK编程中参数的传递.pdf

    因此在处理Java字符串时,需要将jstring对象转换为char*,然后转换为C++的std::string类型。完成操作后,还需要使用ReleaseStringUTFChars函数来释放资源。 示例代码如下: ```cpp const char* cstr = env-&gt;...

Global site tag (gtag.js) - Google Analytics