2016-08-25 60 views
1

工作同事已經實現了一個類,以將本機C++共享庫加載到我們的Android應用中,他將這個類命名爲「LibLoader」。他提出的解決方案是每次需要使用本地庫中聲明的本地函數之一時,實例化LibLoader對象。我相信這從性能角度來看並不是最佳選擇,所以我正在考慮優化這一點的最佳方法。在Android中加載原生共享庫的最佳方式

到目前爲止兩種解決方案已經進入我的腦海:

  1. 充分利用LibLoader類單身
  2. 打開本地方法爲靜態的,所以我不會甚至使對象

考慮本地共享庫,通過靜態/ instace initializacion在類加載,我的問題是:

  1. 從性能的角度來看,這兩種方法中哪一種最好?我需要我的代碼速度很快,我多次調用這些本機函數來計算實時音頻樣本的FFT。
  2. 是否有另一種最佳方法來實現此目的?
  3. 如果將本機方法轉換爲靜態方法,那麼靜態/實例初始化會發生什麼?每次訪問靜態方法時會不會調用它?

我的代碼是:

public class LibLoader { 

static final String TAG = "LibLoader"; 
static boolean armv7 ; 


static 
{ 

    String arch = System.getProperty("os.arch"); 

    //determine which library to load according to CPU type 
    if(arch.contentEquals("armv7l")) 
    { 
     //fftw neon compiled library functions work with armv71 and armv6 
     try { 
      System.loadLibrary("fftwfNeon_fftTwiddle"); //this won't load from any other platform 
      armv7 = true; 
     }catch (UnsatisfiedLinkError e) 
     { 
      Log.e(TAG, "Unable to load fftwfNeon_fftTwiddle library "+ e.getMessage()); 
     } 

    } 
    else 
    { 
     try { 
      System.loadLibrary("fftTwiddle"); 
      armv7 = false; 
     }catch (UnsatisfiedLinkError e) 
     { 
      Log.e(TAG, "Unable to load fftTwiddle library "+ e.getMessage()); 
     } 

    } 
} 

public native void GetComplexFFtDoubleIN(double[] realIN, double[] imagIN, int fftSize, double[] TW, boolean ifftFlag); 

public native void FFTWfNeonSymb(int fftSize, float[] realPart, float[] imagPart, boolean isFFT); 

public native void FFTWfNeonSync(int fftSize, float[] realPart, float[] imagPart, boolean isFFT); 

}

+0

_「如果將本地方法轉換爲靜態方法,會發生什麼?靜態/實例初始化會在每次訪問靜態方法時調用嗎? 「_這對你來說很容易測試。 – Michael

回答

0

有你的方法靜態VS創建類的實例變量,沒有太大影響CPU的性能。但是這兩種實現在內存使用上有很大差異。

如果只是FFT計算,那麼我建議保持靜態。這可以讓你的代碼免受內存泄漏。

更新:在我已經解釋的2個選項之間創建一個單例。這裏有三種方法可以按照內存簡單的順序進行操作。

  1. 所有的方法都是靜態的,你可以直接從你想要的任何類中訪問方法。 (只有內存中的類)
  2. 擁有一個單例變量。創建一個新變量將始終返回相同的靜態變量。 (保持內存中的類和靜態變量)
  3. 在類中使用所需的方法後,創建新變量並刪除內存。 (需要時分配內存並在不使用時清除內存。)
+0

通過「爲類創建一個實例變量」,你的意思是讓我的班級變成單身人士嗎?你介意解釋你的答案嗎? – VMMF

+0

@VMMF我已經編輯了我的答案和更多信息。 – codetiger

相關問題