`

AndroidJNI调用char*与jstring相互转换

 
阅读更多

在使用jni调用时经常遇到数据类型转换问题,以下是char*与jString相互转换的代码:

 

//java字符串转C字符串
char* jstringTostr(JNIEnv* env, jstring jstr)
{        
    char* pStr = NULL;

    jclass     jstrObj   = (*env)->FindClass(env, "java/lang/String");
    jstring    encode    = (*env)->NewStringUTF(env, "utf-8");
    jmethodID  methodId  = (*env)->GetMethodID(env, jstrObj, "getBytes", "(Ljava/lang/String;)[B");
    jbyteArray byteArray = (jbyteArray)(*env)->CallObjectMethod(env, jstr, methodId, encode);
    jsize      strLen    = (*env)->GetArrayLength(env, byteArray);
    jbyte      *jBuf     = (*env)->GetByteArrayElements(env, byteArray, JNI_FALSE);

    if (jBuf > 0)
    {
        pStr = (char*)malloc(strLen + 1);

        if (!pStr)
        {
            return NULL;
        }

        memcpy(pStr, jBuf, strLen);

        pStr[strLen] = 0;
    }

    (*env)->ReleaseByteArrayElements(env, byteArray, jBuf, 0);

    return pStr;
}

 

 

//C字符串转java字符串
jstring strToJstring(JNIEnv* env, const char* pStr)
{
    int        strLen    = strlen(pStr);
    jclass     jstrObj   = (*env)->FindClass(env, "java/lang/String");
    jmethodID  methodId  = (*env)->GetMethodID(env, jstrObj, "", "([BLjava/lang/String;)V");
    jbyteArray byteArray = (*env)->NewByteArray(env, strLen);
    jstring    encode    = (*env)->NewStringUTF(env, "utf-8");

    (*env)->SetByteArrayRegion(env, byteArray, 0, strLen, (jbyte*)pStr);
    
    return (jstring)(*env)->NewObject(env, jstrObj, methodId, byteArray, encode);
}
 

 

 

 

0
0
分享到:
评论
1 楼 doloveme 2012-12-06  
需要注意的是 释放内存!!!

相关推荐

    android jni jstring

    JNI在Android系统中的作用是连接Java应用程序层与本地库,为性能优化、调用系统级API或者利用现有C/C++库提供了可能。本项目主要关注的是在JNI中处理Java的`jstring`类型。 `jstring`是JNI中的一个数据类型,它代表...

    JNI调用第三方动态库

    - **数据类型映射**:JNI提供了Java与C/C++数据类型的映射,例如`jint`对应`int`,`jstring`对应`const char*`。 5. **异常处理** - **Java异常**:在JNI中,如果遇到错误,可以抛出Java异常,通过`env->ThrowNew...

    Android调用Jni返回自定义对象

    通过以上步骤,你就可以在Android应用中使用JNI调用本地代码并返回自定义对象了。这是一个涉及到多层交互和类型转换的过程,理解和掌握它对于提升Android应用的性能和功能具有重要意义。在实际项目中,还需要根据...

    android jni

    6. **数据类型转换**:JNI提供了一系列的类型转换函数,如`jstring`到`const char*`,`jintArray`到`int*`等,用于在Java和C/C++之间传递数据。理解这些转换函数是使用JNI的关键。 7. **异常处理**:在C/C++代码中...

    android jni常用函数详解

    JNI(Java Native Interface)是一种标准机制,允许Java代码调用本地C/C++代码,同时也支持从C/C++调用Java方法。这对于Android开发来说尤其重要,因为它使得开发者能够利用高性能的C/C++代码来实现应用程序中的关键...

    free pascal (lazarus) 版的 android NDK (JNI)调用范例、数据类型转换示例

    1. **JNI调用流程**: - 创建一个C/C++头文件,声明Java方法的本地实现(JNI接口)。 - 在Free Pascal中编写对应的C/C++代码实现这些接口。 - 编译生成动态链接库(.so文件),该库将被Android应用程序加载。 - 在...

    android JNI学习四实例

    Android JNI(Java Native Interface)是Android平台中用于Java与本地C/C++代码交互的框架。JNI允许开发者在Android应用中使用C/C++代码,以实现性能优化、利用现有库或编写底层系统级代码。本教程将通过四个实例来...

    android JNI机制分析

    在Android平台中,Java Native Interface(JNI)是一种让Java代码能够调用本地C/C++代码的方法。通过这种方式,开发人员可以在需要高性能计算的地方使用C/C++编写代码,并在其他地方使用Java来处理用户界面和其他更...

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

    在本文中,我们将深入探讨如何在Android JNI中实现C++层与Java层的对象交互,特别是在NDK开发环境下。 首先,让我们了解JNI的基本概念。JNI是一个接口,它允许Java应用程序调用本地(非Java)代码,同时也允许本地...

    android_jni操作指南.rar

    JNI提供了多种数据类型来匹配Java和C/C++的数据类型,例如`jint`对应`int`,`jstring`对应`const char*`。在本地方法中,需要使用这些类型进行数据转换。 9. **异常处理** JNI提供了异常处理机制,当本地代码抛出...

    Android--开发--JNI编程指南.rar

    在Android开发中,JNI的使用非常广泛,主要用于实现Java无法高效或直接处理的功能,如利用C/C++进行性能优化、调用系统底层库、与硬件设备通信等。以下是对Android JNI编程的详细指南: 1. **JNI基本概念** - JNI...

    最全的JNI书稿统稿.rar

    JNI(Java Native Interface)是Java平台的一个重要特性,它允许Java代码...这本书稿将详细阐述这些知识点,并可能深入到多线程、内存管理、JNI与Android的结合应用等方面,为开发者提供全面理解和掌握JNI的宝贵资源。

    unity2019使用eclipse 与java相互通信

    在Unity2019中,开发人员经常需要与Java环境进行交互,以便利用Java库、服务或者集成Android原生功能。本教程将详细介绍如何在Unity2019中使用Eclipse与Java进行通信,实现跨平台的解决方案。由于Unity主要支持C#...

    android下简单的调用ffmpeg方法

    总结,调用FFmpeg在Android应用中实现多媒体处理,涉及的关键点包括库文件的添加、JNI接口的创建与实现、FFmpeg API的使用以及多线程处理。这只是一个基础的框架,实际应用中可能需要根据具体需求对FFmpeg进行更复杂...

    android jni 获取md5码

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,允许Java代码调用本地(C/C++)代码,反之亦然。当我们需要在Android应用中执行一些性能敏感或者Java无法直接支持的功能时,JNI是一个很好的选择。...

    android jni 编程

    在Android开发中,JNI常用于调用C/C++编写的本地库代码,以此来实现性能密集型的操作或是调用其他语言已经存在的功能。本文档通过一个具体的例子,深入讲解了如何创建和使用Android上的JNI库。 #### 二、Java接口...

    JNI 简介与实现.zip

    7. **字符串处理**:JNI提供了处理Java字符串(`jstring`)到本地字符串(如C字符串`char*`)的函数,如`GetStringUTFChars()`和`NewStringUTF()`。 8. **异常处理**:JNI允许在本地代码中抛出和捕获Java异常,通过...

    java实现调用c动态库

    在这个场景中,我们将探讨如何使用Java通过JNI调用C动态库中的MD5加密算法。 MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它将任意长度的输入转化为固定长度的128位(16字节)的摘要。在安全领域...

    FFmpeg Android 编译以及普通调用

    - FFmpeg的调用通常涉及解析输入文件、编码解码、格式转换等,例如: ```cpp extern "C"JNIEXPORT void JNICALL Java_com_yourpackage_MainActivity_ffmpegExecute(JNIEnv *env, jobject /* this */, jstring ...

    JNI语法.zip

    - 数据类型转换,比如将Java的`int`转换为C的`jint`,字符串`jstring`到C的`char*`等。 3. **Java部分(Java_dllProject)**: - 包含一个或多个Java类,其中声明了`native`方法,并在`main`或其他方法中调用`...

Global site tag (gtag.js) - Google Analytics