JNICC++C#Windows
jbytearray转c++byte数组
-
jbyte*arrayBody=env->GetByteArrayElements(data,0);
-
jsizetheArrayLengthJ=env->GetArrayLength(data);
-
BYTE*starter=(BYTE*)arrayBody;
jbyteArray 转 c++中的BYTE[]
-
-
jbyte*olddata=(jbyte*)env->GetByteArrayElements(strIn,0);
-
jsizeoldsize=env->GetArrayLength(strIn);
-
BYTE*bytearr=(BYTE*)olddata;
-
intlen=(int)oldsize;
C++中的BYTE[]转jbyteArray
-
-
jbyte*by=(jbyte*)pData;
-
jbyteArrayjarray=env->NewByteArray(nOutSize);
-
env->SetByteArrayRegin(jarray,0,nOutSize,by);
jbyteArray 转 char *
-
char*data=(char*)env->GetByteArrayElements(strIn,0);
char* 转jstring
-
jstringWindowsTojstring(JNIEnv*env,char*str_tmp)
-
{
-
jstringrtn=0;
-
intslen=(int)strlen(str_tmp);
-
unsignedshort*buffer=0;
-
if(slen==0)
-
{
-
rtn=env->NewStringUTF(str_tmp);
-
}
-
else
-
{
-
intlength=MultiByteToWideChar(CP_ACP,0,(LPCSTR)str_tmp,slen,NULL,0);
-
buffer=(unsignedshort*)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);
-
}
-
returnrtn;
-
}
下面这个没有用过,刚看到,也写进来,以后如果遇到可以验证下看。
jstring 转 char* 或者 const char*
-
-
constchar*key=env->GetStringUTFChars(str,0);
-
-
jsClient->modify(key,isOffer);
-
env->ReleaseStringUTFChars(str,key);
JNI 返回 jbyteArray
-
JNIEXPORTjbyteArrayJNICALLJava_Test_getByteArray(JNIEnv*env,jobjectobj)
-
{
-
jbyteArrayfirstMacArray=env->NewByteArray(6);
-
......
-
jbyte*bytes=env->GetByteArrayElements(firstMacArray,0);
-
for(inti=0;i<sizeof(pAdapterInfo->Address);i++)
-
{
-
bytes[i]=pAdapterInfo->Address[i];
-
}
-
-
env->SetByteArrayRegion(firstMacArray,0,6,bytes);
-
returnfirstMacArray;
-
}
//jstring to char*
-
char*jstringTostring(JNIEnv*env,jstringjstr)
-
{
-
char*rtn=NULL;
-
jclassclsstring=env->FindClass("java/lang/String");
-
jstringstrencode=env->NewStringUTF("utf-8");
-
jmethodIDmid=env->GetMethodID(clsstring,"getBytes","(Ljava/lang/String;)[B");
-
jbyteArraybarr=(jbyteArray)env->CallObjectMethod(jstr,mid,strencode);
-
jsizealen=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);
-
returnrtn;
-
}
//char* to jstring
-
jstringstoJstring(JNIEnv*env,constchar*pat)
-
{
-
jclassstrClass=env->FindClass("Ljava/lang/String;");
-
jmethodIDctorID=env->GetMethodID(strClass,"<init>","([BLjava/lang/String;)V");
-
jbyteArraybytes=env->NewByteArray(strlen(pat));
-
env->SetByteArrayRegion(bytes,0,strlen(pat),(jbyte*)pat);
-
jstringencoding=env->NewStringUTF("utf-8");
-
return(jstring)env->NewObject(strClass,ctorID,bytes,encoding);
-
}
//将jstring类型转换成windows类型
-
char*jstringToWindows(JNIEnv*env,jstringjstr)
-
{
-
intlength=(env)->GetStringLength(jstr);
-
constjchar*jcstr=(env)->GetStringChars(jstr,0);
-
char*rtn=(char*)malloc(length*2+1);
-
intsize=0;
-
size=WideCharToMultiByte(CP_ACP,0,(LPCWSTR)jcstr,length,rtn,(length*2+1),NULL,NULL);
-
if(size<=0)
-
returnNULL;
-
(env)->ReleaseStringChars(jstr,jcstr);
-
rtn[size]=0;
-
returnrtn;
-
}
//将windows类型转换成jstring类型
-
jstringWindowsTojstring(JNIEnv*env,char*str)
-
{
-
jstringrtn=0;
-
intslen=strlen(str);
-
unsignedshort*buffer=0;
-
if(slen==0)
-
rtn=(env)->NewStringUTF(str);
-
else
-
{
-
intlength=MultiByteToWideChar(CP_ACP,0,(LPCSTR)str,slen,NULL,0);
-
buffer=(unsignedshort*)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);
-
returnrtn;
-
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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[]
-
jfieldIDbyteData=(env)->GetFieldID(clazz,"bData","[B");
-
jbyteArraypDataIn=(jbyteArray)(env)->GetObjectField(objDataIn,byteData);
-
jsizetheArrayLeng=env->GetArrayLength(pDataIn);
//byte[]转为BYTE[]
-
jbyte*arrayBody=env->GetByteArrayElements(pDataIn,0);
-
BYTE*jDataIn=(BYTE*)arrayBody;
//将BYTE数组转为jarray
-
jbyte*byte=(jbyte*)jDataOut;
-
jbyteArrayjarray=env->NewByteArray(theArrayLeng);
-
env->SetByteArrayRegion(jarray,0,theArrayLeng,byte);
//给每一个实例的变量付值
-
(env)->SetObjectField(objDataIn,byteData,jarray);
-
(env)->SetIntField(objDataIn,pDataInLen,jDataInLen);
-
(env)->ReleaseByteArrayElements(pDataIn,arrayBody,0);
其他参考:
Java 通过JNI调用C或者CPP代码
http://blog.csdn.net/kenera/archive/2009/02/16/3895343.aspxhttp://apps.hi.baidu.com/share/detail/15732549http://dniit.blog.163.com/blog/static/28012894200842810332491/http://hi.baidu.com/liangwind/blog/item/7dcce2c9729d1d1e7f3e6f49.html
分享到:
相关推荐
可在jni层返回应用层一个对象数组,包括字符串、整数、小数的成员变量
在java中调用jni中返回的对象或对象数组,即相当于helloword
java向native传递常用基本数据类型 和字符串类型 2. java向native传递数组类型 3. java向native传递自定义java对象 4. java向native传递任意java对象(以向native传递ArrayList为例) 5. native向java传递数组...
一 JNI访问数组 二 访问引用数据类型的数组 三 JNI引用 四 异常 五 缓存 六 缓存策略和弱引用联合使用带来的问题
JNI 中有两种数组操作,基础数据类型数组和对象数组,JNI 对待基础数据类型数组和对象数组是不一样的。 基本数据类型数组 对于基本数据类型数组,JNI 都有和 Java 相对应的结构,在使用起来和基本数据类型的使用...
JNI数组参数传递,在使用JNI编程时注意转换参数,尤其是数组的出入与传出。
JNI传递中文字符串资料
【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 ) 博客地址 : https://hanshuliang.blog.csdn.net/article/details/104103097 I...
本文比较详细 使用jni技术,java里的对象传到c/c++文件里,并且在c/c++里修改后,传到java,以及怎样使用java的listerner,怎么传输数组到c/c++里
java jni 与 c++ 数据类型转换 及调用
jni编写的一个示例,示例中包含一带参数的有返回值的函数。
jni学习——对简单类型数组的访问,本示例通过2中方法介绍java与c之间的通信。
Android的jni的调用CC++的几个应用基本类型数组类结构体.pdf
本例演示了最常用的字符、数值、字符数组、数值数组等在free pascal和android虚拟机之间的互相传递。 代码包括这些数据类型转换示例。
这是我自己写的android jni中构造字符串的例子,
Android Java代码与JNI交互字符串转换(四)
在Android NDK中还没有现成的函数来处理字符串的相互转换,但是Android底层有个libicuuc.so库文件,在目录/system/lib/下可以找到这个文件。在这个文件中有个函数ucnv_convert,我们可以从这个库中找到这个函数,...
08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_03_方法访问_数组处理&jni引用08_15_JNI_...
通过jni将一张彩色图片转换为黑白图片,通过这个demo,可以深入了解jni的应用