`
hm4123660
  • 浏览: 282395 次
  • 性别: Icon_minigender_1
  • 来自: 广州
博客专栏
Dea4ce76-f328-3ab2-b24a-fb268e1eeb75
数据结构
浏览量:69988
社区版块
存档分类
最新评论

jni 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);
}

//将jstring类型转换成windows类型
char* jstringToWindows( JNIEnv *env, jstring jstr )
{
int length = (env)->GetStringLength(jstr );
const jchar* jcstr = (env)->GetStringChars(jstr, 0 );
char* rtn = (char*)malloc( length*2+1 );
int size = 0;
size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );
if( size <= 0 )
return NULL;
(env)->ReleaseStringChars(jstr, jcstr );
rtn[size] = 0;
return rtn;
}
//将windows类型转换成jstring类型
jstring WindowsTojstring( JNIEnv* env, char* str )
{
jstring rtn = 0;
int slen = strlen(str);
unsigned short * buffer = 0;
if( slen == 0 )
rtn = (env)->NewStringUTF(str );
else
{
int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
buffer = (unsigned short *)malloc( length*2 + 1 );
if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
rtn = (env)->NewString( (jchar*)buffer, length );
}
if( buffer )
free( buffer );
return rtn;
}
/*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);
}
*/


jni object的使用

每一个jni格式的dll中的object对应该java里面的一个类。
如下例有一个 ObjData类,类中有成员bData ,Len
public class ObjData {

public byte[]  bData;
public int Len;       
}
//------------------------jni获得传过来的Object类型的变量objDataIn--------

jclass clazz =(env)->FindClass("ObjData");

//从传进来的对象中取出byte[]
jfieldID byteData = (env)->GetFieldID(clazz,"bData","[B");
jbyteArray pDataIn = (jbyteArray) (env)->GetObjectField(objDataIn, byteData);
jsize theArrayLeng = env->GetArrayLength(pDataIn);

//byte[]转为BYTE[]
jbyte * arrayBody = env->GetByteArrayElements(pDataIn,0);
BYTE * jDataIn = (BYTE *)arrayBody;


//将BYTE数组转为jarray
jbyte* byte = (jbyte*)jDataOut;   
jbyteArray jarray = env->NewByteArray(theArrayLeng);
env->SetByteArrayRegion(jarray, 0, theArrayLeng, byte);

//给每一个实例的变量付值
(env)->SetObjectField(objDataIn,byteData,jarray);
(env)->SetIntField(objDataIn,pDataInLen,jDataInLen);

(env)->ReleaseByteArrayElements(pDataIn, arrayBody, 0);

分享到:
评论

相关推荐

    android jni jstring

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

    char *转 jstring

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

    jni数据类型转换

    JNI(Java Native Interface)作为Java平台与本地代码(如C/C++)之间的桥梁,其核心功能之一就是实现不同语言间的数据类型转换。在JNI编程中,理解并掌握Java数据类型与C/C++数据类型之间的对应关系至关重要。本文...

    最全的JNI书稿统稿.rar

    5. **数据类型转换**:JNI提供了丰富的数据类型,如`jobject`、`jclass`、`jmethodID`等,与Java数据类型对应。开发者需要理解如何在Java和C/C++之间转换数据,如`jint`对应Java的`int`,`jstring`对应Java的`String...

    JNI 简介与实现.zip

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

    JNI文档资料源码_2020_01_28_2.zip

    【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/104103097 I...

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

    5. **JNI数据类型转换** - JNI提供了Java数据类型与C/C++数据类型的对应转换函数,如`jint`, `jobject`, `jstring`等。 - 转换示例: ```c++ jstring str = env-&gt;NewStringUTF("Hello from C++"); const char* ...

    JNI调用第三方动态库

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

    JNI 简介与实现(实用1).zip

    6. **数据类型转换**:JNI提供了一系列的数据类型,如`jint`, `jdouble`, `jstring`等,用于在Java和本地代码之间转换数据。例如,将Java的`String`转换为C的`char*`,可以使用`env-&gt;GetStringUTFChars()`。 7. **...

    JNI开发步骤

    - **类型转换**:在Java和C/C++之间传递数据时需要注意类型转换,比如Java中的`boolean`类型对应C/C++中的`jboolean`类型。 - **内存管理**:C/C++代码需要正确处理内存分配和释放,避免内存泄漏等问题。 - **异常...

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

    ### JNI技术手册:C/C++与Java互调详解 #### 一、JNI技术概览 **JNI(Java Native Interface)** 是Java平台的一部分,它允许Java代码与其他语言写的代码进行交互,尤其是C和C++。JNI是Java与本地代码之间沟通的...

    android JNI学习四实例

    **实例二:JNI数据类型转换** 此实例演示了如何在JNI中处理各种Java数据类型,如整型、浮点型、字符串等。Java数据类型需要转换为对应的JNI数据类型,例如`jint`、`jdouble`、`jobject`等。同时,本地方法可以接受...

    android jni常用函数详解

    #### 二、JNI基础概念与术语 - **env**: 指针,指向JNIEnv结构体,用于访问JNI接口的方法。 - **jobject**: Java对象的句柄。 - **jstring**: Java字符串对象的句柄。 - **jclass**: Java类的句柄。 - **jmethodID**...

    jni02基本知识

    7. **数据类型转换**:JNI提供了数据类型转换的方法,例如将Java的`int`转换为C的`jint`,或者将Java的`String`转换为C的`const char*`。 8. **异常处理**:在本地代码中,可以通过`ExceptionCheck`检查是否抛出了...

    android jni

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

    jni实现图片格式转换实例

    本文将深入探讨如何使用JNI来实现图片格式转换的实例。 首先,我们需要理解JNI的工作原理。JNI提供了一个桥梁,使得Java虚拟机(JVM)能够调用本地(非Java)代码,通常是C++或C语言编写的库。这个过程涉及以下步骤...

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

    2. **数据类型转换**: - **字符与字符串**:Java的`char`类型在C/C++中对应`jchar`,字符串是`jstring`。在Free Pascal中,可以使用`JNIEnv`指针的`GetStringUTFChars()`和`ReleaseStringUTFChars()`方法获取和...

    java-JNI调用动态库获取硬件信息制作软件加密

    JNIEXPORT jstring JNICALL Java_JNI_getCPUID_getcpuID(JNIEnv *env, jclass js) { char cpuid[40]; getCpuId(cpuid); return stoJstring(env, cpuid); } ``` **7. 修改JNI头文件** 最后,需要对生成的`JNI_...

    jni学习例子 在linux下执行成功

    2. **Java到C的数据转换**:在JNI中,`jstring`是Java中的字符串对象,而在C/C++中,我们需要将其转化为`char`数组或`const char*`来处理。这通常通过调用`JNIEnv`接口的`GetStringUTFChars`函数实现,该函数将Java...

Global site tag (gtag.js) - Google Analytics