【发布时间】:2016-08-25 04:09:58
【问题描述】:
一位同事实现了一个类来将原生 C++ 共享库加载到我们的 Android 应用程序中,他将这个类命名为“LibLoader”。他提出的解决方案是每次我们需要使用在本机库中声明的本机函数之一时实例化一个 LibLoader 对象。我相信从性能的角度来看这不是最佳的,所以我正在考虑优化它的最佳方法。
到目前为止,我想到了两个解决方案:
- 使 LibLoader 类成为单例
- 将本机方法转换为静态方法,这样我什至不必创建对象
考虑到本机共享库是通过类中的静态/实例初始化加载的,我的问题是:
- 从性能的角度来看,这两种方法中哪一种是最好的?我需要我的代码快速,我多次调用这些本机函数来计算实时音频样本的 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);
}
【问题讨论】:
-
“如果将原生方法转换为静态方法,静态/实例初始化会发生什么?每次访问静态方法时都会调用它吗?”易于测试。
标签: android performance android-ndk singleton shared-libraries