天天看點

JNI中的有關函數參數的一個怪異問題

有一個JAVA層函數,如下:

private void postAudioDataFromNative(int clientId, int dataLen, byte[] dataBuffer,
          long presentTimeUs, String audioType) {
          ...
          }
           

JNI層處理如下:

調用JAVA層函數時

這樣組合使用後, 在JAVA函數中添加列印, String audioType 的值一直未null(但是在傳入前,type值是正常的),而其他參數都是有值的, 且正常。

同樣的代碼,僅修改參數順序, 代碼變為如下:

JAVA層

private void postAudioDataFromNative(int clientId, int dataLen, byte[] dataBuffer,
          String audioType, long presentTimeUs) {
          ...
          }
           

JNI層

調用

這樣組合使用後, 在JAVA函數中添加列印,所有參數值都正常。

有哪位大神指導下,這是為什麼? 不勝感激~~~

為什麼String類型的參數必須在long型參數前, 而不能放在long型參數後。(測試int型,也是隻能放在long型前, 如果放在long型後, 值總是0, 而不是傳入的值(比如傳入2, 但是總是獲得0))

問題原因:

在論壇裡一位大神恢複後, 按照大神的提示, 我檢查了接口參數中的資料類型所占長度, 發現JAVA層和Native中所占長度不一樣, 修改為一樣長度, 即都是32位後, 該問題解決了。 看來是資料類型長度不對等, 造成後邊的參數無法正常傳遞。

重要事情說三遍:

類型要比對!!!

類型要比對!!!

類型要比對!!!