невозможно использовать внешнюю функцию JNI в двух разных классах, ошибка неудовлетворительной связи - PullRequest
1 голос
/ 23 июля 2011

Для приложения Android я реализовал внешнюю функцию в C, которую я хотел бы использовать в двух отдельных классах.

В первом классе (мой основной интерфейс Activity) я вызываю соответствующую loadLibrary:

System.loadLibrary(...);

В том же классе я определяю функцию как нативную:

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

После этого я могу вызвать нативную функцию с без проблем в первом классе. Я не получаю сообщение об ошибке.

Теперь я хочу использовать эту функцию в другом классе. Я полагаю, мне не нужно загружать библиотеку снова. Во втором классе внизу я также определяю:

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 ]

1 голос
/ 23 июля 2011

Вы определили две отдельные функции.Один для первого класса и еще один для второго.Им понадобятся две отдельные заглушки JNI.Вероятно, у вас есть только заглушка и реализация для первого.

JNI и Java, в общем, всегда ссылаются на методы определенного класса.

0 голосов
/ 23 июля 2011

"Кстати, я НЕ хочу использовать: class1.dissectPacket (...); я пытаюсь избежать передачи класса."

Если вы хотите это сделать, функции-члены должны быть статическими, в противном случае класс неявно передается в качестве параметра (я не знаю как, потому что я никогда этого не делал, статические функции всегда работали для меня, но это должно произойти, чтобы работать должным образом).

Так что измените свои заглушки метода на:

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