对于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(...);我试图避免通过课程。
答案 0 :(得分:1)
您实际上定义了两个独立的功能。一个用于第一个类,另一个用于第二个类。他们需要两个独立的JNI存根。你可能只有第一个存根和实现。
JNI和Java通常总是引用特定类的方法。
答案 1 :(得分:0)
“顺便说一下,我不想使用:class1.dissectPacket(...);我试图避免传递这个类。”
如果你想这样做,成员函数需要是静态的,否则这个类被隐式地作为参数传递(我不知道怎么回事,因为我从来没有这样做过,静态函数一直对我有用,但它必须正常工作)。
所以将方法存根更改为:
public static native int dissectPacket(byte[] header, byte[] data, int encap);