Ошибка JNI при вызове подпрограммы C - PullRequest
2 голосов
/ 11 июля 2011

Я хочу вызвать подпрограмму C из Java.Я использую JNI.Я создал файлы .java, .c и .h и скомпилировал DLL.Все файлы находятся в одной папке.Но когда я запускаю программу, она показывает unsatisfiedlinkError.Где я ошибаюсь ...?

Когда я изучаю JNI, я использовал исходный код: http://www.ibm.com/developerworks/java/tutorials/j-jni/section2.html и вещи, которые я уже пробовал:

  • Создание dll с использованием Code :: Blocks (ide) и GCC в качестве компилятора
  • Создание dll с использованием GCC из командной строки (Ref. http://sig9.com/node/35)
  • Яиспользуя 32-битную Win7, и я предполагаю, что все описанные выше методы генерируют 32-битные DLL
  • Все решения, которые я нашел для создания DLL (разделяемой библиотеки), предназначены для MS VC / VCPP, и у меня его нетмоя машина прямо сейчас.

В чем проблема?Файлы DLL генерируются без каких-либо исключений, но когда я запускаю код Java, он выдает исключение.


PS: если есть какие-либо теоретические примеры, объясняющие, как работает JNI и что на самом деле делает,тогда любезно поделитесь ссылкой ...

Брошенное сообщение или исключение:

    c:\myjava1>java Sample1
    Exception in thread "main" java.lang.UnsatisfiedLinkError: Sample1.intMethod(I)I
      at Sample1.intMethod(Native Method)
      at Sample1.main(Sample1.java:11)

В конце дня после создания DLL-файла много раз, я почти уверен, что тамвозможно, с этим нет проблем, что-то не так с путем ... Я изменил метод loadlibrary с методом load , но все равно не повезло, .....


по предложению MOD: я обсуждаю этот вопрос в посте: ошибка JNI при вызове подпрограммы C, я публикую здесь все коды, так как комментарии имеют ограниченные символы ... Пример1.c

#include "jni.h"
#include"Sample_Sample1.h"
JNIEXPORT jint JNICALL Java_Sample_Sample1_test(JNIEnv *env, jobject obj){
return(1);
}
void main(){}

Sample1.java

package Sample;

public class Sample1
{
public native int test();
static{ 
System.loadLibrary("Sample1");
}
public static void main(String[] args)
{
 Sample1 sample = new Sample1();
 System.out.println(sample.test());
 }
}

Sample_Sample1.h (генерируется с помощью команды javah -jni)

/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class Sample_Sample1 */

#ifndef _Included_Sample_Sample1
#define _Included_Sample_Sample1
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Sample_Sample1
 * Method:    test
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_Sample_Sample1_test
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

Может кто-нибудь подсказать мне, где проблема«В предыдущем посте я упоминал, что ткод, который я использую, взят из учебных пособий, но чтобы просто изменить то, что я изменил, коды ... При использовании ** java Sample.Sample1 "я получаю:

c: \ myjava1> java Sample.Sample1 Исключение в потоке "main" java.lang.UnsatisfiedLinkError: Sample.Sample1.test () Я в Sample.Sample1.test (собственный метод) в Sample.Sample1.main (Sample1.java:12)

Ответы [ 3 ]

2 голосов
/ 11 июля 2011

Вам необходимо , чтобы ваша библиотека явно указала путь .

Возможно, что флаги, которые вы там используете, не совсем правильные. Попробуйте это:

gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at \
    -I[Java_HOME]/include -I[Java_HOME]/include/win32 \
    -shared -o Sample1.dll Sample1.c

С MinGW GCC site .

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

Наконец-то решил проблему с помощью метода System.load (), System.loadLibrary () У меня все еще не работает ... он продолжает выдавать одно и то же исключение, и я думаю, что проблема была с .dll Спасибо всем, кто поддерживал и отвечал ...

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

Вы проверили свою DLL, вызвав ее из заглушки приложения C ++? Обратите особое внимание на точное название (включая заглавные буквы) метода (ов), который вы вызываете.

Javadoc для UnsatisfiedLinkError говорит: «Выдается, если виртуальная машина Java не может найти подходящее определение на родном языке метода, объявленного собственным». Это, вероятно, означает, что либо имя написано с ошибкой, либо ваша DLL не там, где JVM ожидает его найти.

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