Я определяю класс Java из C с помощью DefineClass (), но получаю UnsatisfiedLinkError - PullRequest
6 голосов
/ 30 июля 2010

Я определяю Java-класс из C с помощью вызова JNI DefineClass (), а затем регистрирую собственные обратные вызовы для методов в классе, которые являются родными.У класса есть два статических метода, оба из которых являются нативными.Я использую RegisterNatives () для регистрации нативных функций.Оба вызова завершаются успешно.

Но когда я ссылаюсь на эти нативные методы из своего Java-кода, я получаю java.lang.UnsatisfiedLinkError myPackage.myClass.myMethod (I) V

Но я знаю, что DefineClass вернул aобъект класса для myPackage.myClass, и я знаю, что myMethod (I) V был зарегистрирован как метод для этого класса.

Я получаю этот сбой так же, как он собирается выполнить main () - где вызовМой родной метод (в настоящее время для тестирования).

В качестве теста я дважды пытался вызвать DefineClass на одном и том же JNIEnv, чтобы увидеть, что произошло.Я получаю дубликат ошибки определения класса.Я также попытался вызвать FindClass () после его определения, и JNIEnv возвращает ссылку на определенный класс.

Таким образом, я определенно создаю класс динамически, но он терпит неудачу, когда я пытаюсь ссылаться на его методы.

Есть идеи?Все приветствуются.

Платформа: Windows, 32-битный код на 64-битной XP.

1 Ответ

3 голосов
/ 13 сентября 2011

Кажется, что вы не можете определить собственный метод с помощью DefineClass () и вызывать этот собственный метод непосредственно из введенного кода. Вы должны иметь метод батута в своем внедренном классе (в форме байтовых кодов Java), который затем вызывает ваши собственные методы. Только тогда это будет работать. Мне понадобилось три дня, чтобы разобраться с этим.

Еще одно замечание: убедитесь, что введенный вами код верен. Код, который я пробовал, выглядел верным, но при ближайшем рассмотрении я извлекал константу размером 4 байта из пула констант в качестве операнда для инструкции 8 байтов. Так что провалился верификатор. Как только это было исправлено (и родной батут), все заработало.

Однако, чтобы пройти через все различные перестановки, мне пришлось потратить 3 дня. Чувствовал себя хорошо, даже если работал.

Как сделать батут? Посмотрите примеры (в C), которые поставляются с Java SDK. Они довольно длинные и не подходят для размещения здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...