Cli*_*iff 5 c++ java java-native-interface
我需要帮助将二进制数据传递给Java.我正在尝试使用jbytearray但是当数据进入Java时它看起来很糟糕.有人可以帮我一把吗?
这是一些示例代码的片段.首先是原生C++方面:
printf("Building audio array copy\n");
jbyteArray rawAudioCopy = env->NewByteArray(10);
jbyte toCopy[10];
printf("Filling audio array copy\n");
char theBytes[10] = {0,1,2,3,4,5,6,7,8,9};
for (int i = 0; i < sizeof(theBytes); i++) {
toCopy[i] = theBytes[i];
}
env->SetByteArrayRegion(rawAudioCopy,0,10,toCopy);
printf("Finding object callback\n");
jmethodID aMethodId = env->GetMethodID(env->GetObjectClass(obj),"handleAudio","([B)V");
if(0==aMethodId) throw MyRuntimeException("Method not found error",99);
printf("Invoking the callback\n");
env->CallVoidMethod(obj,aMethodId, &rawAudioCopy);
Run Code Online (Sandbox Code Playgroud)
然后是Java回调方法:
public void handleAudio(byte[] audio){
System.out.println("Audio supplied to Java [" + audio.length + "] bytes");
byte[] expectedAudio = {0,1,2,3,4,5,6,7,8,9};
for (int i = 0; i < audio.length; i++) {
if(audio[i]!= expectedAudio[i])
System.err.println("Expected byte " + expectedAudio[i]
+ " at byte " + i + " but got byte " + audio[i]);
else System.out.print('.');
}
System.out.println("Audio passed back accordingly!");
}
Run Code Online (Sandbox Code Playgroud)
调用回调时,我得到以下输出:
library loaded!
Audio supplied to Java [-2019659176] bytes
Audio passed back accordingly!
Run Code Online (Sandbox Code Playgroud)
修复了上述错误后,我现在正在寻找将原始字节数组复制回 Java 的最有效方法。我上面的内容似乎不太理想,因为我计划支持大量的重复副本。我尝试将 char 数组直接传递给 setByteArrayRegion 调用,这似乎在这个简单的情况下工作,但我想知道是否需要执行固定。当您在本机端创建新数组时,这是如何完成的?我是否只需在设置后使用 FALSE 调用 getByteArrayRegion 即可?Java 调用完成后我可以取消固定吗?是否有我可以学习的高性能原始二进制数据穿梭回 java 的在线示例?
| 归档时间: |
|
| 查看次数: |
5055 次 |
| 最近记录: |