2015-06-11 44 views
0

我正在處理一些我無法控制的代碼,而且我正在處理的ByteBuffer被傳遞給本地方法。我沒有訪問本地代碼,但它期望「buf」是一個ByteBuffer。還要注意,代碼沒有任何意義,但有很多,所以我正在將它提煉出來。把一個字節緩衝區放到一個包中

public class otherClass { 
    public final void setParams(Bundle params) { 
      final String key = params.keySet()[0]; 
     Object buf = params.get(key)); 
     nativeSet(key, buf); 
    } 

    private native final void nativeSet(key, buf); 
} 

這裏是我的代碼:

public void myMethod(ByteBuffer myBuffer) { 

     final Bundle myBundle = new Bundle(); 
     myBundle.putByteBuffer("param", myBuffer); 
     otherClass.setParams(runTimeParam); 

} 

的問題? Bundle中沒有putByteBuffer方法。似乎有點奇怪,有一個get()返回一個對象,但沒有通用put()。

但是,對我來說似乎很奇怪的是,本機代碼需要一個ByteBuffer。當它從Java層傳入時,是不是會有一堆元數據呢?可以在本地層進行編碼預測元數據並從ByteBuffer中提取?

有沒有什麼辦法在這裏可靠地傳遞一個ByteBuffer?它可能有點冒險。我想也許我可以找出ByteBuffer對象的位數,轉換爲整數,並使用putInt()。不知道如何從ByteBuffer對象到原始數據。

回答

0

假設這應該起作用。打開字節的緩衝區爲字符串,並傳遞到你的包是這樣的:

byte[] byteArray = byteString.getBytes(); 
ByteBuffer byteBuffer = ByteBuffer.allocate(byteArray.length + 8); 
byteBuffer.put(byteArray); 

byte[] bytes = myBuffer.getBytes(Charset.forName("UTF-8")); 
String byteString = new String(bytes, Charset.forName("UTF-8")); 
myBundle.putString("param", byteString); 

那麼字符串重建的ByteBuffer

相關問題