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

时间:2011-07-23 03:20:48

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

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

在第一堂课(我的主要活动用户界面)中,我调用了相应的loadLibrary:

System.loadLibrary(...);

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

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

执行此操作后,我可以在第一个类中使用 no problem 调用本机函数。我没有得到任何不满意的链接错误。

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

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

然而,当我尝试在第二课中使用本机函数时,我得到:

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

在两个类中使用该函数的正确方法是什么?如果我不将该函数重新定义为第二类中的本机(称为 Packet ),则会收到错误:

The method dissectPacket(byte[], byte[], int) is undefined for the type Packet
顺便说一句,我不想​​使用:class1.dissectPacket(...);我试图避免通过课程。

2 个答案:

答案 0 :(得分:1)

您实际上定义了两个独立的功能。一个用于第一个类,另一个用于第二个类。他们需要两个独立的JNI存根。你可能只有第一个存根和实现。

JNI和Java通常总是引用特定类的方法。

答案 1 :(得分:0)

“顺便说一下,我不想使用:class1.dissectPacket(...);我试图避免传递这个类。”

如果你想这样做,成员函数需要是静态的,否则这个类被隐式地作为参数传递(我不知道怎么回事,因为我从来没有这样做过,静态函数一直对我有用,但它必须正常工作)。

所以将方法存根更改为:

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