jni jstring 、char* 类型的转换
//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);
分享到:
相关推荐
2. **转换为C字符串**:使用`env->GetStringUTFChars()`函数,可以将`jstring`转换为可读写的C风格字符串(`char*`)。这个过程需要注意内存管理,因为`GetStringUTFChars()`返回的指针需要在使用完毕后释放,通过`...
C++调用java java调用C++ 字符串参数传递 类型的转换
### JNI数据类型转换详解 JNI(Java Native Interface)作为Java平台与本地代码(如C/C++)之间的桥梁,其核心功能之一就是实现不同语言间的数据类型转换。在JNI编程中,理解并掌握Java数据类型与C/C++数据类型之间...
- **类型转换**:在Java和C/C++之间传递数据时需要注意类型转换,比如Java中的`boolean`类型对应C/C++中的`jboolean`类型。 - **内存管理**:C/C++代码需要正确处理内存分配和释放,避免内存泄漏等问题。 - **异常...
5. **数据类型转换**:JNI提供了丰富的数据类型,如`jobject`、`jclass`、`jmethodID`等,与Java数据类型对应。开发者需要理解如何在Java和C/C++之间转换数据,如`jint`对应Java的`int`,`jstring`对应Java的`String...
- **数据类型映射**:JNI提供了Java与C/C++数据类型的映射,例如`jint`对应`int`,`jstring`对应`const char*`。 5. **异常处理** - **Java异常**:在JNI中,如果遇到错误,可以抛出Java异常,通过`env->ThrowNew...
2. **数据类型转换**: - **字符与字符串**:Java的`char`类型在C/C++中对应`jchar`,字符串是`jstring`。在Free Pascal中,可以使用`JNIEnv`指针的`GetStringUTFChars()`和`ReleaseStringUTFChars()`方法获取和...
7. **数据类型转换**:JNI提供了数据类型转换的方法,例如将Java的`int`转换为C的`jint`,或者将Java的`String`转换为C的`const char*`。 8. **异常处理**:在本地代码中,可以通过`ExceptionCheck`检查是否抛出了...
// 数据类型转换 JNIEXPORT jstring JNICALL Java_JNI_getCPUID_getcpuID(JNIEnv *env, jclass js) { char cpuid[40]; getCpuId(cpuid); return stoJstring(env, cpuid); } ``` **7. 修改JNI头文件** 最后,...
5. **JNI数据类型转换** - JNI提供了Java数据类型与C/C++数据类型的对应转换函数,如`jint`, `jobject`, `jstring`等。 - 转换示例: ```c++ jstring str = env->NewStringUTF("Hello from C++"); const char* ...
JNI提供了多种数据类型来匹配Java和C/C++的数据类型,例如`jint`对应`int`,`jstring`对应`const char*`。在本地方法中,需要使用这些类型进行数据转换。 9. **异常处理** JNI提供了异常处理机制,当本地代码抛出...
【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/104103097 I...
6. **数据类型转换**:JNI提供了一系列的类型转换函数,如`jstring`到`const char*`,`jintArray`到`int*`等,用于在Java和C/C++之间传递数据。理解这些转换函数是使用JNI的关键。 7. **异常处理**:在C/C++代码中...
JNI定义了一组基本数据类型,这些类型对应于Java的基本数据类型。例如: ```c typedef long jint; typedef __int64 jlong; typedef signed char jbyte; typedef unsigned char jboolean; typedef unsigned short ...
6. **数据类型转换**:JNI提供了一系列的数据类型,如`jint`, `jdouble`, `jstring`等,用于在Java和本地代码之间转换数据。例如,将Java的`String`转换为C的`char*`,可以使用`env->GetStringUTFChars()`。 7. **...
为了确保Java与C/C++之间能够顺利通信,JNI提供了一套数据类型映射规则。 - **基本类型映射**: - `boolean` 映射为 `jboolean`(Z) - `byte` 映射为 `jbyte`(B) - `char` 映射为 `jchar`(C) - `short` ...
7. **字符串处理**:JNI提供了处理Java字符串(`jstring`)到本地字符串(如C字符串`char*`)的函数,如`GetStringUTFChars()`和`NewStringUTF()`。 8. **异常处理**:JNI允许在本地代码中抛出和捕获Java异常,通过...
通过以上详细的步骤和技术要点,我们可以看到,无论是Java调用C/C++还是C/C++调用Java,都需要仔细地处理数据类型转换、异常处理以及性能优化等问题。掌握这些技术细节,对于开发高效稳定的跨语言应用程序至关重要。
本文将深入探讨如何使用JNI来实现图片格式转换的实例。 首先,我们需要理解JNI的工作原理。JNI提供了一个桥梁,使得Java虚拟机(JVM)能够调用本地(非Java)代码,通常是C++或C语言编写的库。这个过程涉及以下步骤...