簡體   English   中英

Java 本機大 jshortarray 具有超過 int 元素

[英]Java native big jshortarray with more than int elements

如何創建一個包含 545460846912 個元素的 jshortarray

 retval = env->NewShortArray((long) 545460846912);  // allocate
                 ~~~~~~~~~~~~~ ^~~~~~~~~~~~~~~~~~~
..test.cpp:296:42: warning: implicit conversion from 'long' to 'jsize' (aka 'int') changes value from 545460846912 to 320 [-Wconstant-conversion]
    env->SetShortArrayRegion(retval, 0 , (long) 545460846912, (short const *)b); 
         ~~~~~~~~~~~~~~~~~~~             ^~

嘗試模仿這段代碼

int nGetEncoderFrameSize = (int) LibSpeex.nGetEncoderFrameSize(nInitSpxEncoder);

它為我的文件返回 545460846912

我需要制作一個具有該大小的短數組

 short[] sArr = new short[nGetEncoderFrameSize];

然后調用它:

long nEncodeBuffer = LibSpeex.nEncodeBuffer(nInitSpxEncoder, sArr, bArr, 65536);

是否可以創建這么大的 jshortArray?

我該如何解決?

如何創建一個包含 545460846912 個元素的 jshortarray

不能

根據Java 9 語言規范(粗體):

Arrays 必須由int值索引 shortbytechar值也可以用作索引值,因為它們經過一元數字提升(§5.6.1)並成為int值。

嘗試訪問具有long索引值的數組組件會導致編譯時錯誤。

在運行時檢查所有數組訪問; 嘗試使用小於零或大於或等於數組長度的索引會導致拋出 ArrayIndexOutOfBoundsException。

Java 17 的措辭是相同的

Java int值的范圍限於(再次,加粗我的):

4.2.1. 積分類型和值

整數類型的值是以下范圍內的整數:

  • 對於byte ,從 -128 到 127,包括
  • short ,從 -32768 到 32767,包括
  • 對於int ,從 -2147483648 到 2147483647,包括
  • 對於long ,從 -9223372036854775808 到 9223372036854775807,包括
  • 對於char ,從 ' ' 到 '�' 包括在內,即從 0 到 65535

2147483647 小於 545460846912。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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