[英]how to write and read from bytebuffer passing from java to jni
我的android項目需要幫助。 我想將緩沖區從java傳遞給jni,我的C ++代碼將填充數據。 然后java將在屏幕上顯示它們。 我對C ++並不熟悉,也不知道如何寫入寫入緩沖區。
這就是我得到的。 在java中
ByteBuffer bb = ByteBuffer.allocateDirect(216);
IssmJni.processBuffer(bb);
本地方法
public static native void processBuffer(ByteBuffer bb);
我不使用jni_onload,所以在C ++中沒有javah
static void fillBuffer(JNIEnv *env, jclass clazz, jobject buf)
{
double *dBuf = env->GetDirectBufferAddress(env, buf);
}
我被困在這里 ,我可以做雙dbuf嗎? 或者它必須是一個炭 ?
我想說我想給這個dbuf寫1,2,3,4,5,我該怎么做? 我在想dbuf.put(1); ... dbuf.put(5)但它不起作用。 在填充之后,我只是在java中調用bb.get(position)嗎?
有人為我澄清這個,例如將不勝感激謝謝
這是我的原生方法表
static JNINativeMethod method_table [] = {
{"fac" , "(J)J" , (void *) factorial},
{"getBuffer", "()[D" , (void *) getBufferNative},
//{"processBuffer", "(Ljava/nio/ByteBuffer)V", (void *) fillBuffer}};
除了最后一個之外,其他兩個工作正常。
我不使用jni_onload,所以在C ++中沒有javah
這可能與您的問題無關,但您必須做一個或另一個。 您需要在onLoad函數中執行Java-to-Native方法映射,或者使用javah生成JNI可以在運行時獲取的方法簽名。 否則,永遠不會調用您的本機方法。
但是,如果正確調用了本機方法,那么無論你做什么都可能沒問題。
我被困在這里,我可以做雙dbuf嗎? 或者它必須是一個炭?
該函數的返回值實際上是一個void*
,因此您可以將它轉換為您想要的任何指針類型,因為它只是一個內存地址。 但是,直接緩沖區的實際數據類型將是jbyte
,它是signed char
的typedef,因此以下可能是最好的:
jbyte *dBuf = env->GetDirectBufferAddress(env, buf);
我想說我想給這個dbuf寫1,2,3,4,5,我該怎么做?
C / C ++中用於訪問數組中值的符號是[]符號,即:
jbyte *dBuf = env->GetDirectBufferAddress(env, buf);
dBuf[0] = 63;
dBuf[1] = 127;
// ...and so on...
在填充之后,我只是在java中調用bb.get(position)嗎?
是的,您可以使用ByteBuffer
上的訪問器方法來訪問您從本機代碼中編寫的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.