java - 无法从加载器加载库

标签 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 (.)

最佳答案

您缺少 JNA 自己的 native 支持。请参阅this question .

请注意,您需要遵循 Android 的特定规则来将 native 代码与您的应用 bundle 和加载。

编辑

具体来说,您的项目必须包含资源路径

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

JNA 将在

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

您可以设置系统属性-Djna.debug_load=true-Djna.debug_load.jna=true JNA 将发送到标准输出,分别在其中查找您的库和它自己的库。

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

关于java - 无法从加载器加载库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28214702/

相关文章:

java - Java 中 Atomic set() 和 getAndSet() 方法的区别

java - 使用 Java 8 Stream 的 DataProvider 查询中的 IndexOutOfBoundsException

android media player 不播放来自具有空格或特殊字符的 url 的音频文件

android - 更改 Android 谷歌地图的标记范围

c# - 如何找到 DLL 入口点?

If-Then-Else 的 Java 正则表达式抛出错误

java - 无法在 hibernate 中连接到服务器数据库

android - 通知问题

c++ - 使用 C++ 导出重载函数

c - 为什么这个C程序会无限循环?