2015-11-23 5 views
-1

я получаю неудовлетворенную ошибку линии при вызове JNI method.Below моих журналовПолучения Неудовлетворенных ошибок Link делая JNI вызов

Журналы

new exception [Handler processing failed; nested exception is java.lang.UnsatisfiedLinkError: demo.JNIWrapper.packet_mining_start(Ljava/lang/String;)I] with root cause 

java.lang.UnsatisfiedLinkError: demo.JNIWrapper.packet_mining_start(Ljava/lang/String;)I 
    at demo.JNIWrapper.packet_mining_start(Native Method) 
    at demo.RESTController.getPcap(RESTController.java:97) 

Ниже мой JNI код

public class JNIWrapper { 

    static{ 


     System.load("/home/XXX/XXX/Library/newJNI/libJNIDemo.so"); 


    } 



    //Get Path in output param and status 
    public native int packet_mining_start(String fileName); 
} 

Теперь этот метод вызывается из файла Main.java и при создании объекта для этого класса (JNIWrapper jni = new JNIWrapper()), в течение которого выполняется вызов System.load I d ont получает любую ошибку.

Теперь, когда я вызываю метод packet_mining_start в JNI, я получаю ошибку.

Мой .h файл метод является (Примечание не создается из файла класса Java)

uint32_t pax_packet_mining_start(uint8_t* mining_query_file_name); 

Этот метод не содержит JNIEXPORT и JNICALL переменные или типы в нем .so, если метод, который не делает содержать JNIExport и вызов этого метода даст ошибку UnsatisfiedLink?

Обязательно ли иметь JNICall и JNIExport в собственном методе?

Как я могу интегрировать это с моим обычным c-файлом?

+0

'Мой .h метод файла (примечание не создано из файла класса Java)' Таким образом, вы не использовали 'javah.exe' для создания заголовков C? – PaulMcKenzie

+0

@PaulMcKenzie да, я не использовал javah для создания файла заголовка (в основном экспериментировал, как я могу вызвать собственный метод без создания файла заголовка с использованием javah) –

+0

Метод, описанный трассировкой стека 'demo.JNIWrapper.packet_mining_start (Ljava/lang/String;) I', не соответствует объявленному в представленном вами Java-коде. Они различаются по количеству и типу аргументов.Либо вы оставляете важные детали, либо ваши классы находятся в противоречивом состоянии. –

ответ

1

JNIEXPORT и JNICALL определены в соответствии с платформой, на которой вы находитесь. Если вы используете систему Windows, JNIEXPORT будет обязательным в DLL, поскольку библиотеки DLL содержат информацию о том, какие функции экспортируются, и функция не будет видна вне вашей DLL (и, следовательно, вы не сможете ее загрузить). В системах Linux символы экспортируются в любом случае, поэтому вам не нужно явно объявлять об этом.

JNICALL - это конвенция о вызове, которая является stdcall на windows и cdecl всюду. Если ваше соглашение о вызове неверно, вы, вероятно, повредите стек, вызвав ошибку сегментации, но в то время это не похоже на проблему.

Есть еще одна проблема, вы, кажется, принимаете uint8_t * в качестве аргумента, тогда как вы передаете объект Java String методу. В java String является типом объекта и не преобразуется автоматически в стиль C const char *.

У вас должна быть другая функция между этими двумя функциями, которая принимает аргументы Java, имеет правильное соглашение о вызове и экспортируется вне вашей библиотеки, а затем преобразует объект Java String в uint8_t * и вызывает вашу исходную функцию. Таким образом вы устраните эту ошибку (и, возможно, больше ошибок, с которыми вы столкнетесь позже).

И так как вы отметили этот вопрос как C++, не забудьте поставить extern «C» перед вашей функцией, чтобы ваш компилятор не искажал имена. Java не может найти функции, как только их имена будут искажены.

+0

* В системах Linux символы экспортируются в любом случае *, если вы не измените видимость по умолчанию на "скрытые" –

Смежные вопросы