在Android应用程序中使用现有的共享库(.so)

Thi*_*ago 10 java-native-interface android android-ndk

我有以下方案可以继续.我得到了一个共享库(libeffect.so),用于我正在为客户工作的Android项目.我没有共享库源代码,我只有.so文件.该库已预编译为可在Android设备上运行.与共享库一起,我有方法签名

public static native void doEffect(int param1, IntBuffer intBuffer);
Run Code Online (Sandbox Code Playgroud)

所以现在我有一些关于如何调用源的本机方法的问题,如果这可能只有.so文件,那么它们是:

  1. 我是否需要将本机方法签名放在与.so相同的包/类中,或者我可以在项目的任何包/类中使用此签名,在运行时jvm将能够找到该方法共享库?例如,如果这个共享库首先在类mypackage.MyClass中使用,我是否需要创建相同的包,类,然后将方法签名放在那里?

  2. 我在哪里需要将这个.so文件放在我的eclipse android项目中,以便在我的apk文件中部署这个文件?

这些问题可能听起来像菜鸟,但我从来没有使用过jndi所以我有点担心如果调用方法doEffect没有任何错误就可以实现.任何可以指导我的答案都是非常受欢迎的.

非常感谢Thiago

Suj*_*jit 6

  1. 我是否需要将本机方法签名放在与.so相同的包/类中,或者我可以在项目的任何包/类中使用此签名,在运行时jvm将能够找到该方法共享库?例如,如果这个共享库首先在类mypackage.MyClass中使用,我是否需要创建相同的包,类,然后将方法签名放在那里?

无需创建相同的包/类.您可以将方法签名放在任何包中.

public class NativeLib {

  static {
    System.loadLibrary("so_file");
  }

  public static native void doEffect(int param1, IntBuffer intBuffer);

}
Run Code Online (Sandbox Code Playgroud)

2.我需要在我的eclipse android项目中放置这个.so文件才能将这个文件部署到我的apk文件中?

您已将此.so文件放在应用程序的lib文件夹中.如果没有lib文件夹,那么您可以创建一个lib文件夹并放入.so文件.你可以使用System.loadLibrary("so_ file")来调用它;