2015-02-15 4 views
0

Итак, я новичок в JNI, и я следую примеру простого приветствия, но продолжаю получать ошибку UnsatisfiedLinkError. Что я делаю не так? Вот мой .h файл:JNI UnsatisfiedLink Error

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

#ifndef _Included_JNITEST_jnihellonative 
#define _Included_JNITEST_jnihellonative 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  JNITEST_jnihellonative 
* Method: hellofromc 
* Signature:()V 
*/ 
JNIEXPORT void JNICALL Java_JNITEST_jnihellonative_hellofromc(JNIEnv *,jobject); 

#ifdef __cplusplus 
} 
#endif 
#endif 

.c Файл

#include <jni.h> 
#include<stdio.h> 
#include<windows.h> 
#include "jnihellonative.h" 

JNIEXPORT void JNICALL 
Java_JNITESTS_jnihellonative_hellofromc(JNIEnv *env, jobject obj){ 
    printf("Hello World"); 
    return; 
    } 

Java главный класс

package JNITEST; 


public class Jnihello { 


    public static void main(String[] args) { 
     jnihellonative jniprint = new jnihellonative(); 
     jniprint.hellofromc(); 
    } 

} 

Java класс

package JNITEST; 


public class jnihellonative { 

    public native void hellofromc(); 

    static{ 
     System.load("C:\\Users\\Kevin\\Documents\\NetBeansProjects\\JniHelloTest.dll"); 
    } 
} 

Я получаю эту ошибку

Exception in thread "main" java.lang.UnsatisfiedLinkError: JNITEST.jnihellonative.hellofromc()V 
    at JNITEST.jnihellonative.hellofromc(Native Method) 
    at JNITEST.Jnihello.main(Jnihello.java:19) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 1 second) 

Я попытался использовать System.load() и System.loadLibrary(), но я получаю такую ​​же ошибку.

ответ

0

Вы изменили имя своего класса с момента создания файла .h и создали файл .c. Файл .h имеет jnihellonative, ваш код Java имеет Jnihello.

Я попытался с помощью System.load() и System.loadLibrary()

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

+0

Спасибо, я снова создал .h и. c и идентичны тем, которые я ранее имел, но я изменил имя файлов на JNITEST_jnihellonative и, похоже, работал. –

+0

Невозможно. Изменение имен файлов .h или .c не влияет на Java. Вам нужно было изменить имя собственного метода с 'Java_JNITESTS_jnihellonative_hellofromc' на' Java_JNITEST_JniHello_hellofromc'. – EJP

+0

если я перехожу к 'Java_JNITEST_JniHello_hellofromc', проблема остается, потому что это' javahellonative', который имеет собственный метод jni. Так что я сделал, был чистым и создал java-код, удалил старые .h и .c файлы, сгенерировал новые с указанным выше именем, скомпилировал код C и сгенерировал DLL-файл и запустил программу. Казалось, это сработало для меня. Также, сравнивая новые .c и .h со старыми, они все те же. –