`
lfzhs
  • 浏览: 76171 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

JNI和C++中的String相互转换

    博客分类:
  • JNI
阅读更多

 

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

    JNI处理hashmap,string等对象的操作

    对于String对象的处理,JNI提供了`NewStringUTF`函数来创建一个新的Java String对象,以及`GetStringUTFChars`和`ReleaseStringUTFChars`来获取和释放字符串的UTF-8表示。例如,你可能需要在本地代码中解析或修改...

    Jni中C++和Java的参数传递

    在JNI中,我们可以使用C++或C语言编写本地方法,这些本地方法可以直接访问和操作Java对象,包括传递参数和接收返回值。在涉及到C++和Java之间的参数传递时,有一些特定的规则和技巧需要注意。 首先,我们要理解Java...

    java通过jni和c++代码之间实现互相调用

    本教程将深入探讨如何使用 JNI 实现 Java 和 C++ 之间的互相调用,以及如何处理不同类型的数据。 首先,我们需要理解 JNI 的基本概念。JNI 是一个接口,它定义了一套函数,这些函数在 JVM(Java 虚拟机)内部提供对...

    jni调用c++ delphi中的dll.

    本主题将深入探讨如何通过JNI来调用C++和Delphi中编译生成的DLL动态链接库。 1. **JNI基础** JNI是Java平台的核心组件之一,它为Java应用程序提供了一个桥梁,使其能够与本地代码交互。JNI提供了一系列的函数接口...

    Jni中C++和Java的参数传递.pdf

    在C++中,你可以创建一个函数来处理这种转换,并通过JNI的`NewObject`和`GetObjectField`等函数获取Java对象的字段值。 总的来说,JNI提供了一种灵活的方式来连接Java和C++代码,允许开发者充分利用两种语言的优点...

    Android JNI中C++层与Java层的对象交互实例

    `Student`对象在C++中没有直接对应的类型,因此我们需要使用JNI的`jobject`和类型转换。例如: ```cpp extern "C" JNIEXPORT void JNICALL Java_com_kevin_ndk08_code_as_MainActivity_putObject( JNIEnv *env, ...

    android jni 中文字符传递demo

    在Android应用开发中,JNI(Java Native Interface)是一种让Java代码和本地(C/C++)代码交互的技术。本文将深入探讨如何在Android的JNI中处理中文字符传递的问题,这是一个非常实用且重要的技能,特别是在需要高...

    MyJNI.rar_C++ JNI_jni

    5. **数据类型转换**:JNI提供了一套映射机制,用于在C++和Java之间转换数据类型。例如,Java的`int`对应C++的`jint`,`String`对应`jstring`,`ArrayList`对应` jobjectArray`等。 6. **动态链接库编译**:将C++...

    jni数据类型转换

    在JNI环境中,处理Java的`String`类型尤其需要注意,因为其在C/C++中表现为`char*`形式。 1. **从Java到C/C++**: 当Java传递一个`String`至C/C++时,首先会转换为`jstring`。若需进一步处理,则可将其转换为`char...

    java的jni方式调用C++封装的库文件

    总结:使用JNI调用C++库的过程涉及Java和C++的协同工作,包括Java环境配置、JNI接口设计、头文件生成、C++源码编写、编译生成DLL以及在Java中加载和调用。整个过程需要对两种语言都有一定的了解,但通过这种方式,...

    使用C++创建java虚拟机JVM,使用JNI调用java函数.zip

    在上述过程中,需要注意Java和C++的数据类型转换,因为它们之间存在差异。例如,Java的`int`在JNI中是`jint`,`String`是`jstring`。对于复杂类型,如数组或对象,需要使用特定的JNI函数进行处理。 在提供的资源...

    androidjni编程,java和c层的互相通信传递数据

    Android JNI(Java Native Interface)编程是Android开发中的一个重要部分,它允许Java代码和其他语言(如C/C++)编写的代码进行交互。JNI在Android平台上扮演着桥梁的角色,使得开发者能够利用C/C++的强大性能和...

    使用JNI调用本地接口(解决中文字符传递,源码+说明)

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他...通过这个教程,你可以掌握使用JNI调用本地接口并处理中文字符的核心技术,这对于需要混合Java和C/C++开发的项目来说是非常有价值的。

    jni 构造字符串

    在Android中,当你需要在C/C++代码中创建Java字符串对象时,可以使用JNI提供的函数`NewString`。这个函数接受两个参数:一个`jchar`类型的数组,以及数组的长度。`jchar`是JNI中的一个类型,它对应于Java中的`char`...

    JNI传递中文字符串资料

    JNI(Java Native Interface)是Java平台提供的一种标准接口,它允许Java代码和其他语言写的代码进行交互,特别...通过学习这些文档,开发者将能够熟练地在JNI环境中处理包含中文的字符串,实现Java和C/C++的无缝交互。

    java c++ 通信之间的乱码解决方法

    在Java中,可以使用`getBytes`和`new String`配合指定编码进行转换;在C++中,通常需要手动处理编码转换,可能需要用到第三方库如iconv等。 总之,Java和C++通过Socket通信时,要确保双方对字符编码的一致性,避免...

    android studio使用jni调用opencv库实现图片转换Demo【详细实例源码】

    在Android开发中,有时我们需要利用高性能的C++库来处理图像或者进行计算密集型任务,OpenCV是一个广泛使用的计算机视觉库,提供了丰富的图像处理和计算机视觉功能。JNI(Java Native Interface)则是Java平台用于...

    JAVA C++ JNI小结一下JNI编程

    JNI提供了多种数据类型映射方式,使得Java数据类型能够与C/C++数据类型相互转换。 #### 方法签名 在JNI中,每个本地方法都有一个特定的签名,用于指示方法的返回类型、参数类型及其顺序。例如,一个带有整型参数的...

Global site tag (gtag.js) - Google Analytics