`

android JNI调用 - 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, "<init>", "([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);
} 

 

分享到:
评论
1 楼 kangear 2014-04-17  
使用你的方法出现如下问题呀:
:94:30: error: base operand of '->' has non-pointer type 'JNIEnv {aka _JNIEnv}'

相关推荐

    char *转 jstring

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

    Android JNI调用-文件操作

    总结起来,Android中的JNI调用允许开发者使用C/C++进行文件操作,提供更高的效率和灵活性。通过声明native方法、编写C/C++代码、配置构建系统以及处理权限,开发者可以充分利用JNI进行复杂或性能敏感的文件操作。...

    JNI调用第三方动态库

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

    JNI技术手册 c/c++调用java

    - 减少JNI调用次数。 - 避免频繁的数据复制。 - **解决本机平台接口调用问题:** - 使用平台相关的API。 - 处理不同操作系统下的差异。 - **嵌入式开发应用(JNI小例子):** - 定义新的类和方法。 - 处理Java...

    android jni常用函数详解

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

    android jni jstring

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

    Android_JNI_Docs.pdf

    1. **定义本地方法**:首先,在Java类中声明需要通过JNI调用的方法,这些方法前面需要加上`native`关键字。 ```java public native int add(int a, int b); ``` 2. **生成头文件**:使用`javah`工具生成相应的...

    android jni详解

    Java Native Interface (JNI) 是一种强大的技术,它允许Java代码调用本地代码(如C/C++),从而在Android应用开发中发挥重要作用。JNI不仅增强了应用性能,还提供了丰富的功能扩展能力。本文旨在深入解析Android中...

    Java JNI调用动态库(Linux、Windows)的实现步骤

    ### Java JNI调用动态库(Linux、Windows)的实现步骤 #### 一、概述 Java Native Interface (JNI) 是一种标准的 Java 接口,它允许 Java 代码和其他语言(如 C 或 C++)编写的代码进行交互。通过 JNI,Java 应用...

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

    ### Java与C++交互(JNI学习笔记) #### 一、Java类型与C/C++类型对应关系 在Java Native Interface (JNI) 中,Java 和 C/C++ 的数据类型有着明确的对应关系。理解这些对应关系是实现Java与C++交互的基础。 - **...

    Android JNI调用c语言加密程序

    本文将深入探讨如何在Android应用中通过JNI调用C语言编写的加密程序。 **JNI简介** JNI是一种允许Java代码和其他语言写的代码进行交互的框架。它为Java程序员提供了一种方式,可以在Java应用程序中直接调用本地(非...

    Android 计算数学表达式(NDK JNI方式)

    - **调用JNI方法**:在Android应用中,加载动态链接库,并调用`calculate`方法。 **4. 解析和计算数学表达式** 在`Calculator.cpp`中,我们需要实现一个函数来解析和计算表达式。可以选择以下策略: - **使用现有库...

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

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

    Android studio jni如何集成第三方库文件

    2. **JNI 调用失败**:确保 Java 类中 `System.loadLibrary()` 方法中的字符串与 `.so` 文件名完全一致,并且 C/C++ 代码中实现了所有被调用的方法。 #### 五、总结 通过以上步骤,我们成功地在 Android Studio 中...

    android使用jni技术

    5. **在Java中调用JNI方法**:最后,在Android应用的Java代码中,你可以像调用普通Java方法一样调用`callNativeFunction`。 ```java NativeHelper helper = new NativeHelper(); String response = helper....

    JAVA 调用DLL

    - **数据类型转换**:Java和C/C++的数据类型可能不完全相同,需要进行相应的转换,例如Java的`int`对应C的`jint`,Java的`String`对应C的`char*`等。 4. **示例中的`ttsDemo`**: 假设`ttsDemo.dll`是一个文本转...

    android JNI机制分析

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

    Android JNI 用C函数写本地库读写文件,底层调用小例子

    JNI是Android提供的一种接口,使得Java应用程序可以调用C/C++编写的原生代码。这在需要高性能计算、访问硬件特性或利用已有的C库时特别有用。JNI的核心在于`JNIEnv`指针,它是Java虚拟机与本地代码之间的桥梁,提供...

    Android Studio NDK及so文件开发

    - **性能优化**:通过JNI调用C/C++代码,可以在特定场景下显著提升应用性能。 - **代码重用**:利用现有的C/C++库,避免重复造轮子。 - **代码安全性**:对于需要高度安全性的部分,使用C/C++可以提供额外的安全保障...

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

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

Global site tag (gtag.js) - Google Analytics