【发布时间】:2014-03-15 11:25:14
【问题描述】:
我正在使用 JNI 测试直接 ByteBuffer(java.nio.ByteBuffer)。所以下面的代码试图:
- 在 Java 中将值直接放入 ByteBuffer
- 在 C++ 中更改值
- 在 Java 中获取值
我想知道我到底哪里做错了? C++ 代码设法从 Java 中获取数据,但 C++ 中的更改并没有反映在 Java 中。
这是我在 java 上所做的:
public static void main(String[] args){
ByteBuffer bb = ByteBuffer.allocateDirect(3);
byte[] b = {122,121,120};
System.out.println("1: " + new String(b));
bb.put(b);
new JNI.process(bb);
byte[] c = new byte[3];
c[0] = bb.get();
System.out.println("4: " + new String(c));
}
这是我在 JNI 函数上所做的:
JNIEXPORT void JNICALL Java_MarsJNI_mapreduce
(JNIEnv *env, jobject thisObj, jobject output){
char *out = (char*)env->GetDirectBufferAddress(output);
printf("2: %s\n", out);
out = "ABC";
printf("3: %s\n", out);
}
我得到的结果是:
1: zyx
2: zyx
3: ABC
Exception in thread "main" java.nio.BufferUnderflowException
at java.nio.Buffer.nextGetIndex(Buffer.java:474)
at java.nio.DirectByteBuffer.get(DirectByteBuffer.java:208)
at MarsJNI.main(MarsJNI.java:21)
【问题讨论】:
-
除了@TedBigham 提到的,你的问题是你的修改永远不会进入原始数组
-
@fge 你指的是 out = "ABC";在 C++ 代码中?
-
@TedBigham 确实是的
-
我也怀疑过,但我的 C++ 相当生锈。我认为他需要做一个 strcpyn。
-
@TedBigham 应该是
strncpy()但这确实是问题的本质
标签: java java-native-interface