无法从加载程序加载库

时间:2015-01-29 12:25:01

标签: java android dll jna

我在通过我的Android应用程序加载一些.dll库时遇到问题,事实上有很多关于这个问题的问题但是没有任何一个解决了我的问题,以下是我试图实现它们的方法:

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    System.loadLibrary("NetSDKDLL"); // this is where I'm getting the Exception
    simpleDLL INSTANCE = (simpleDLL) Native.loadLibrary(
            ("NetSDKDLL"), simpleDLL.class);
  }

   public interface NetSDKDLL extends StdCallLibrary {
      int IP_NET_DVR_RealPlay(NativeLong nLoginId);
   }
}

这是日志:

01-29 12:20:34.407: E/AndroidRuntime(1623): FATAL EXCEPTION: main
01-29 12:20:34.407: E/AndroidRuntime(1623): Process: com.example.removed, PID: 1623
01-29 12:20:34.407: E/AndroidRuntime(1623): java.lang.UnsatisfiedLinkError: Couldn't load NetSDKDLL from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.removed-2.apk"],nativeLibraryDirectories=[/data/app-lib/com.example.removed-2, /system/lib]]]: findLibrary returned null
01-29 12:20:34.407: E/AndroidRuntime(1623):     at java.lang.Runtime.loadLibrary(Runtime.java:358)
01-29 12:20:34.407: E/AndroidRuntime(1623):     at java.lang.System.loadLibrary(System.java:526)
01-29 12:20:34.407: E/AndroidRuntime(1623):     at com.example.removed.MainActivity.onCreate(MainActivity.java:34)

并给出一个清晰的概述:

1-我在SDK中没有问题,它的路径已经在eclipse和系统环境中分配。

2- dll库放在名为 dll 的源文件夹中。

3- dll库也放在 libs 文件夹中。

4-我在常规Java应用程序中使用相同的方式,它运行良好。


更新

新例外:

02-01 09:18:44.840: E/AndroidRuntime(1145): Caused by: java.lang.UnsatisfiedLinkError: Native library (com/sun/jna/android-i686/libjnidispatch.so) not found in resource path (.)

1 个答案:

答案 0 :(得分:1)

您缺少JNA自己的原生支持。请参阅this question

请注意,您需要遵循Android的特定规则,才能在应用中捆绑和加载本机代码。

修改

具体而言,您的项目必须包含资源路径

com/sun/jna/<arch-specific>/libjnidispatch.so

JNA将在

下查找您的本机库
<arch-specific>/<mapped-library-name>

您可以设置系统属性-Djna.debug_load=true-Djna.debug_load.jna=true和JNA将分别向stdout发出寻找你的库和它自己的库的信息。

JNA在Platform.RESOURCE_PREFIX中提供<arch-specific>的值。