如何将托管的无符号char *转换为jbyte *?
由于我是新手,因此摘要也将很有帮助。
这是我的本机代码:
JNIEXPORT jobject JNICALL Java_com_me_NativeCaller_processImages
(JNIEnv *env, jclass c, jbyteArray front, jbyteArray back){
unsigned char* frontBuffer = convertJByteArrayIntoUnsignedChar(env, front);
unsigned char* backBuffer = convertJByteArrayIntoUnsignedChar(env, back);
System::Collections::Generic::List<cli::array<unsigned char>^>^ returnedValue = processImages(frontBuffer,backBuffer);
jbyte* bytes;
bytes = returnedValue[1];
bytes = returnedValue[2];
jbyteArray intermediateArray1 = env->NewByteArray(1);
env->SetByteArrayRegion(intermediateArray1,0,1,bytes);
return static_cast<jobject>(intermediateArray1);
}
在这里,在
bytes = returnedValue[1];
处出现错误,提示“不能将cli :: array ^类型的值分配给jbyte *类型的实体”返回字节列表的c#代码:-
public static List<byte[]> processImages(byte[] frontImage, byte[] backImage)
{
CallProcessFrontBackAndMICR(frontImage,backImage);
List<Image> imagesToReturn = GetAllPages(tiffFileBuffer);//convert byte[] into two separate images
front = imagesToReturn[0];
back = imagesToReturn[1];
List<byte[]> bytesToReturn = new List<byte[]>();
bytesToReturn.Add(imageToByteArray(front));
bytesToReturn.Add(imageToByteArray(back));
return bytesToReturn;
}
如果有人可以帮助我,这真的很有帮助。
最佳答案
要将unsigned char *
格式的数据转换为Java中的jbyteArray
的byte[]
,如果我没记错的话,您想要执行以下操作:
JNIEnv *env... //usually from your method signature in the jni
unsigned char *myCharData; // by stipulation you have this somehow.
const int yourArraySize = // as per usual number of elements in the char *
jbyteArray myJByteArray = env->NewByteArray(yourArraySize);
env->SetByteArrayREgion(myJByteArray, 0, yourArraySize, (jbyte *) myCharData);
// your myJByteArray is ready to use. Don't forget to memory manage your myCharData, mind!
在给定jbyte的类型定义的情况下,c样式强制转换可以工作,在此实现中我们可以认为是安全的。
在撰写此问题时,我还不知道数据来自何处,因此可以猜测here找到特定于Android的文档。