簡體   English   中英

如何寫入和讀取從java傳遞到jni的bytebuffer

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM