在Android

时间:2016-08-25 04:09:59

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

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

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

  1. 使LibLoader类成为单例
  2. 将原生方法变为静态方法,因此我甚至不必制作对象
  3. 考虑到本机共享库是通过类中的static / instace initializacion加载的,我的问题是:

    1. 从性能的角度来看,这两种方法中哪一种最好?我需要快速编写代码,我会多次调用这些本机函数来计算实时音频样本的FFT
    2. 还有另一种最佳方法吗?
    3. 如果将本机方法转换为静态方法,静态/实例初始化会发生什么?每次访问静态方法时都会调用它吗?
    4. 我的代码是:

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

      }

1 个答案:

答案 0 :(得分:0)

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

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

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

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