android - 不能在两个不同的类中使用外部 JNI 函数,不满足链接错误

标签 android linker java-native-interface android-ndk

对于 Android 应用程序,我用 C 实现了一个外部函数,我想在两个单独的类中使用它。

在第一个类(我的主 Activity UI)中,我调用了适当的 loadLibrary:

System.loadLibrary(...);

在同一个类中,我将函数定义为native:

public native int dissectPacket(byte[] header, byte[] data, int encap);

这样做之后,我可以在第一个类中毫无问题地调用 native 函数。我没有收到任何不满意的链接错误。

现在,我想在另一个类中使用这个函数。我想我不需要再次加载库。在第二个类中,在底部,我还定义了:

public native int dissectPacket(byte[] header, byte[] data, int encap);

但是,当我尝试在第二个类中使用 native 函数时,我得到:

07-22 23:13:13.083: ERROR/AndroidRuntime(6737): Caused by: java.lang.UnsatisfiedLinkError: dissectPacket

在这两个类中使用函数的正确方法是什么?如果我没有在第二个类(称为 Packet)中将函数重新定义为 native 函数,我会得到错误:

The method dissectPacket(byte[], byte[], int) is undefined for the type Packet

顺便说一句,我不想​​使用:class1.dissectPacket(...);我正在努力避免通过该类(class)。

最佳答案

您实际上定义了两个独立的函数。一个用于头等舱,另一个用于二等舱。他们将需要两个独立的 JNI stub 。您可能只有第一个的 stub 和实现。

JNI和Java,一般来说,都是指具体类的方法。

关于android - 不能在两个不同的类中使用外部 JNI 函数,不满足链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6798022/

相关文章:

android - android中的内存模拟

android - 如何从deployment_cert.der 文件计算Facebook 的 key 哈希?

c++ - 如何从 C 调用 Java 方法(无需先从 Java 调用 C)

java - 为什么我的 fragment 中的 Activity 上下文为空?

c++ - 警告 LNK4099 : PDB 'vc100.pdb' was not found also if the file is there

ios - 如何使用 libSystem.B 在 XCode 4 中为 iOS 3.1 部署目标构建?

c++ - 使用多个命名空间对 vtable 的 undefined reference

c++ - JNI 从 c 调用 java 得到段错误(核心转储)

Java+JNI 相对于纯C++

java - Firebase,删除用户时无法删除用户记录