【问题标题】:Optimum way to load native shared library in Android在 Android 中加载原生共享库的最佳方式
【发布时间】:2016-08-25 04:09:58
【问题描述】:

一位同事实现了一个类来将原生 C++ 共享库加载到我们的 Android 应用程序中,他将这个类命名为“LibLoader”。他提出的解决方案是每次我们需要使用在本机库中声明的本机函数之一时实例化一个 LibLoader 对象。我相信从性能的角度来看这不是最佳的,所以我正在考虑优化它的最佳方法。

到目前为止,我想到了两个解决方案:

  1. 使 LibLoader 类成为单例
  2. 将本机方法转换为静态方法,这样我什至不必创建对象

考虑到本机共享库是通过类中的静态/实例初始化加载的,我的问题是:

  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);

}

【问题讨论】:

  • “如果将原生方法转换为静态方法,静态/实例初始化会发生什么?每次访问静态方法时都会调用它吗?”易于测试。

标签: android performance android-ndk singleton shared-libraries


【解决方案1】:

让你的方法静态与为类创建实例变量对 CPU 性能影响不大。但是这两种实现在内存使用方面有很大不同。

如果只是 FFT 计算,我建议保持静态。这可以使您的代码免受内存泄漏的影响。

更新:创建单例在我解释的两个选项之间。以下是您可以按照记忆简单的顺序执行此操作的 3 种方法。

  1. 所有方法都是静态的,您可以从任何您想要的类中直接访问这些方法。 (内存中只有类)
  2. 有一个单例变量。创建新变量将始终返回相同的静态变量。 (将类和静态变量保存在内存中)
  3. 在类中使用所需方法后创建新变量并删除内存。 (在需要时分配内存并在不使用时将其清除。)

【讨论】:

  • “为类创建实例变量”是指让我的类成为单例类吗?你介意解释一下你的答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多