`
104zz
  • 浏览: 1504399 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

jbytearray转c++byte数组

 
阅读更多

jbyte * arrayBody = env->GetByteArrayElements(data,0); 

 

jsize theArrayLengthJ = env->GetArrayLength(data); 

 

BYTE * starter = (BYTE *)arrayBody; 

 

jbyteArray 转 c++中的BYTE[]

 

//jbytearray strIn

 

jbyte * olddata = (jbyte*)env->GetByteArrayElements(strIn, 0);

 

jsize  oldsize = env->GetArrayLength(strIn);

 

BYTE* bytearr = (BYTE*)olddata;

 

int len = (int)oldsize;

 

C++中的BYTE[]转jbyteArray

 

//nOutSize是BYTE数组的长度 BYTE pData[]

 

jbyte *by = (jbyte*)pData;

 

jbyteArray jarray = env->NewByteArray(nOutSize);

 

env->SetByteArrayRegin(jarray, 0, nOutSize, by);

 

jbyteArray 转 char *

 

char* data = (char*)env->GetByteArrayElements(strIn, 0);

 

char* 转jstring

 

jstring WindowsTojstring(JNIEnv* env, char* str_tmp)

{

 jstring rtn=0;

 int slen = (int)strlen(str_tmp);

 unsigned short* buffer=0;

 

 if(slen == 0)

 {

  rtn = env->NewStringUTF(str_tmp);

 }

 else

 {

  int length = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, NULL, 0);

  buffer = (unsigned short*)malloc(length*2+1);

  if(MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, (LPWSTR)buffer, length) > 0)

  {

   rtn = env->NewString((jchar*)buffer, length);

  }

 }

 if(buffer)

 {

  free(buffer);

 }

 return rtn;

}

 

下面这个没有用过,刚看到,也写进来,以后如果遇到可以验证下看。

 

jstring 转 char* 或者 const char*

 

// jstring str

 

const char *key = env->GetStringUTFChars(str, 0);

 

//jboolean isOffer

 

jsClient->modify(key, isOffer);

 

env->ReleaseStringUTFChars(str, key);

 

 

JNI 返回 jbyteArray 

 

JNIEXPORT jbyteArray JNICALL Java_Test_getByteArray(JNIEnv *env, jobject obj)
{
jbyteArray firstMacArray = env->NewByteArray( 6 );

..elided...

jbyte *bytes = env->GetByteArrayElements( firstMacArray, 0);

for ( int i = 0; i < sizeof( pAdapterInfo->Address ); i++ )
{
bytes[ i ] = pAdapterInfo->Address[ i ];
}

env->SetByteArrayRegion(firstMacArray, 0, 6, bytes );

return firstMacArray;
}

 

//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); 

分享到:
评论

相关推荐

    JNI调用大全

    Chap1:JNI完全手册......Chap8:如何将java传递过来的jbyteArray转换成C/C++中的BYTE数组... 47 Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能... 47 Chap9:如何编写jni方法(转载)... 55

    JNI完全技术手册 带完整书签

    Chap8:如何将java传递过来的jbyteArray转换成C/C++中的BYTE数组... 47 Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能... 47 Chap9:如何编写jni方法(转载)... 55 1、实例一:在jni中调用标准c中...

    Android将camera获取到的YuvData在jni中转化为Mat方法

    今天小编就为大家分享一篇Android将camera获取到的YuvData在jni中转化为Mat方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    python源码期末大作业基于opencv+TensorFlow的人脸识别+数据集+详细代码解释(期末大作业项目).rar

    本项目基于OpenCV和TensorFlow实现了一个功能完善的人脸识别系统,并附赠了详细的数据集与代码注释。对于计算机专业的学生、教师或企业员工而言,这无疑是一份极具价值的参考资料,尤其适合那些在人工智能、通信工程、自动化及软件工程领域寻求提升的学习者。 项目涵盖了从图像预处理到模型训练、评估及实际应用的全过程。利用OpenCV的强大图像处理能力,对人脸进行精准定位与特征提取;再结合TensorFlow的深度学习框架,构建并训练出高效的人脸识别模型。此外,项目还精心准备了详尽的数据集,确保模型的训练效果。 代码部分,每一行都有详尽的注释,旨在帮助读者快速理解并掌握核心算法。无论是人脸识别的初学者,还是希望在此基础上进一步研究的开发者,都能从中获得宝贵的启示。 经过严格的测试,本项目的各项功能均运行正常,表现出色。请放心下载使用,相信它将成为您课程设计或毕业设计的得力助手,助您在学术与职业道路上取得更高的成就。

    C语言超市管理系统.zip

    C语言超市管理系统.zip

    apktool版本2.9.0

    apktool版本2.9.0

    1716134031000637_forchheimer_flow.zh_CN.mph

    1716134031000637_forchheimer_flow.zh_CN.mph

    免开3d场景直接清除3d病毒的插件-3d巡警V1.01

    可以直接不打开3d场景就能查杀3d文件的病毒3dsmax杀毒插件。 提供全盘+指定位置查杀的扫描方式,识别各种3d病毒,例如ALC、CRP、ADSL、西山居、MFX以及各种嵌入 广告,通过最新的3dsmax极速检测技术,能高效清除3d场景中的病毒。无论是专业设计师还是普通用户, 都不用担心3d文件再被破坏。

    13.py

    13.py

    python数据分析实例 python数据分析实例(源码)

    python数据分析实例 python数据分析实例(源码) # python数据分析 #### 介绍 python数据可视化例子 ##### 1.SARIMAX模型对公路车流量预测 ##### 2.古诗词云统计 ##### 3.对大数据岗位可视化分析

    Matlab mtd的8通道算法。附带高斯白噪声、多普勒频移的动目标回波.zip

    Matlab mtd的8通道算法。附带高斯白噪声、多普勒频移的动目标回波.zip

    网页爱心特效 HTML5+jQuery制作温馨浪漫爱心表白动画特效.zip

    网页爱心特效 HTML5+jQuery制作温馨浪漫爱心表白动画特效.zip

    要安装NumPy,你可以使用Python的包管理器pip

    numpy 要安装NumPy,你可以使用Python的包管理器pip

    php在线加密网站源码.zip

    压缩包里有多少个php就会被加密多少个PHP、php无需安装任何插件。 如果上传的压缩包里有子文件夹(子文件夹里的php文件也会被加密),加密后的压缩包需要先修复一下,步骤:打开压缩包 =》 工具 =》 修复压缩文件

    Vue+element ui +mongodb+express的网上书城系统

    后台管理系统是基于element ui框架开发的,实现了一个web网上书城系统 实现了后端商品管理界面设计功能。element ui 的优点在于可以方便的开发出功能丰富而且美观的后台管理界面,不需要写很多的CSS代码就可以实现布局,因为框架的开发就在于对代码的封装,而使用框架开发就只需要调用就好。

    Using Docker

    Using Docker

    传统的基于用户的协同过滤推荐算法实现.zip

    协同过滤算法(Collaborative Filtering)是一种经典的推荐算法,其基本原理是“协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息”。它主要依赖于用户和物品之间的行为关系进行推荐。 协同过滤算法主要分为两类: 基于物品的协同过滤算法:给用户推荐与他之前喜欢的物品相似的物品。 基于用户的协同过滤算法:给用户推荐与他兴趣相似的用户喜欢的物品。 协同过滤算法的优点包括: 无需事先对商品或用户进行分类或标注,适用于各种类型的数据。 算法简单易懂,容易实现和部署。 推荐结果准确性较高,能够为用户提供个性化的推荐服务。 然而,协同过滤算法也存在一些缺点: 对数据量和数据质量要求较高,需要大量的历史数据和较高的数据质量。 容易受到“冷启动”问题的影响,即对新用户或新商品的推荐效果较差。 存在“同质化”问题,即推荐结果容易出现重复或相似的情况。 协同过滤算法在多个场景中有广泛的应用,如电商推荐系统、社交网络推荐和视频推荐系统等。在这些场景中,协同过滤算法可以根据用户的历史行为数据,推荐与用户兴趣相似的商品、用户或内容,从而提高用户的购买转化率、活跃度和社交体验。 未来,协同过滤算法的发展方向可能是结合其他推荐算法形成混合推荐系统,以充分发挥各算法的优势。

    毕业设计[主机域名]PHP+AJAX的whois查询程序_whois.zip

    毕业设计[主机域名]PHP+AJAX的whois查询程序_whois.zip

    基于Python实现了基于物品的协同过滤推荐算法和基于用户的协同过滤推荐算法.zip

    协同过滤算法(Collaborative Filtering)是一种经典的推荐算法,其基本原理是“协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息”。它主要依赖于用户和物品之间的行为关系进行推荐。 协同过滤算法主要分为两类: 基于物品的协同过滤算法:给用户推荐与他之前喜欢的物品相似的物品。 基于用户的协同过滤算法:给用户推荐与他兴趣相似的用户喜欢的物品。 协同过滤算法的优点包括: 无需事先对商品或用户进行分类或标注,适用于各种类型的数据。 算法简单易懂,容易实现和部署。 推荐结果准确性较高,能够为用户提供个性化的推荐服务。 然而,协同过滤算法也存在一些缺点: 对数据量和数据质量要求较高,需要大量的历史数据和较高的数据质量。 容易受到“冷启动”问题的影响,即对新用户或新商品的推荐效果较差。 存在“同质化”问题,即推荐结果容易出现重复或相似的情况。 协同过滤算法在多个场景中有广泛的应用,如电商推荐系统、社交网络推荐和视频推荐系统等。在这些场景中,协同过滤算法可以根据用户的历史行为数据,推荐与用户兴趣相似的商品、用户或内容,从而提高用户的购买转化率、活跃度和社交体验。 未来,协同过滤算法的发展方向可能是结合其他推荐算法形成混合推荐系统,以充分发挥各算法的优势。

    Euclidean;Pearson;Tanimoto;基于用户的协同过滤;基于物品的协同过滤;.zip

    协同过滤算法(Collaborative Filtering)是一种经典的推荐算法,其基本原理是“协同大家的反馈、评价和意见,一起对海量的信息进行过滤,从中筛选出用户可能感兴趣的信息”。它主要依赖于用户和物品之间的行为关系进行推荐。 协同过滤算法主要分为两类: 基于物品的协同过滤算法:给用户推荐与他之前喜欢的物品相似的物品。 基于用户的协同过滤算法:给用户推荐与他兴趣相似的用户喜欢的物品。 协同过滤算法的优点包括: 无需事先对商品或用户进行分类或标注,适用于各种类型的数据。 算法简单易懂,容易实现和部署。 推荐结果准确性较高,能够为用户提供个性化的推荐服务。 然而,协同过滤算法也存在一些缺点: 对数据量和数据质量要求较高,需要大量的历史数据和较高的数据质量。 容易受到“冷启动”问题的影响,即对新用户或新商品的推荐效果较差。 存在“同质化”问题,即推荐结果容易出现重复或相似的情况。 协同过滤算法在多个场景中有广泛的应用,如电商推荐系统、社交网络推荐和视频推荐系统等。在这些场景中,协同过滤算法可以根据用户的历史行为数据,推荐与用户兴趣相似的商品、用户或内容,从而提高用户的购买转化率、活跃度和社交体验。 未来,协同过滤算法的发展方向可能是结合其他推荐算法形成混合推荐系统,以充分发挥各算法的优势。

Global site tag (gtag.js) - Google Analytics