工作同事已經實現了一個類,以將本機C++共享庫加載到我們的Android應用中,他將這個類命名爲「LibLoader」。他提出的解決方案是每次需要使用本地庫中聲明的本地函數之一時,實例化LibLoader對象。我相信這從性能角度來看並不是最佳選擇,所以我正在考慮優化這一點的最佳方法。在Android中加載原生共享庫的最佳方式
到目前爲止兩種解決方案已經進入我的腦海:
- 充分利用LibLoader類單身
- 打開本地方法爲靜態的,所以我不會甚至使對象
考慮本地共享庫,通過靜態/ instace initializacion在類加載,我的問題是:
- 從性能的角度來看,這兩種方法中哪一種最好?我需要我的代碼速度很快,我多次調用這些本機函數來計算實時音頻樣本的FFT。
- 是否有另一種最佳方法來實現此目的?
- 如果將本機方法轉換爲靜態方法,那麼靜態/實例初始化會發生什麼?每次訪問靜態方法時會不會調用它?
我的代碼是:
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);
}
_「如果將本地方法轉換爲靜態方法,會發生什麼?靜態/實例初始化會在每次訪問靜態方法時調用嗎? 「_這對你來說很容易測試。 – Michael