2010-01-27 2 views
0

Я получаю следующее сообщение об ошибке. Пожалуйста, посоветуйте, где я могу ошибаться.JNI Неудовлетворительная ошибка связи

Исключение в потоке "основного" java.lang.UnsatisfiedLinkError: Plcio.open (Ljava/языки/String;) Я на Plcio.open (нативный метод) на Plcio.main (Plcio.java:11)

Я уверен, что библиотека присутствует в указанном пути.

Plcio.java

public class Plcio { 
private native int open(String plcName); 
static { 
    //System.loadLibrary("test"); 
    System.load("/home/usr/plcioExampleslib/libtest.so"); 
} 


public static void main(String[] args) { 
    Plcio plcio = new Plcio(); 
    int result = plcio.open("virtual"); 
    System.out.println("result = " + result); 
} 
} 

Plc.h

#ifndef _PLC_H 
#define _PLC_H 

#include<iostream> 
#include<string> 
#include<vector> 
#include<plc.h> 
#include<jni.h> 

typedef PLC* plcPointer; 

class Plc{ 

public: 
Plc() { } 
Plc(const std::string &plctype, const std::vector<int> &data):_plctype(plctype),_data(data) {} 

JNIEXPORT jint JNICALL Java_Plcio_open (JNIEnv *env, jobject jobj, jstring name) ; 

private: 
plcPointer _ptr; 
const std::string _plctype; 
std::vector<int> _data; 
}; 


#endif 

Plc.cpp

#include "Plc.h" 
#include <jni.h> 

using namespace std; 

JNIEXPORT jint JNICALL Plc::Java_Plcio_open (JNIEnv *env, jobject jobj, jstring name) { 

    const char *plcname = (env)->GetStringUTFChars(name, 0); 
    _ptr = plc_open(const_cast<char*>(plcname)); 
    env->ReleaseStringUTFChars(name, plcname); 

    if(_ptr == NULL) { 
    plc_print_error(_ptr, "plc_open\n"); 
    return -1; 
    } else 
     cout << " open successfully " << endl; 
    return 0;  
} 

Привет,

-H

ответ

3

Насколько я знаю, вы не можете использовать функции экземпляра C++ в качестве функций JNI. В среде выполнения нет ссылки на экземпляр класса C++.

Вы можете попробовать объявить Plc::Java_Plcio_open как static, который должен работать (но, конечно, приносит некоторые последствия).

+0

Нет, вы не можете просто объявить Java_Plcio_open статическим. Java не может найти функцию в классе C++ или пространстве имен, она должна быть независимой функцией, объявленной в блоке «C» extern. – Qwertie

0

Прежде всего, вы, вероятно, не внедрили все функции заголовков.

Выполните следующие действия

1 - Перейдите в каталог .so 2 - Do:

$ ld libteste.so 

И проверьте, есть ли какие-либо функции не являющиеся реализованы :)

1

Извините, но вы делать это очень неправильно. Посмотрите тутуарий или несколько примеров на JNI.

Вы должны запускать javah в классе с помощью собственного метода. Это создает заголовочный файл C/C++ с объявлением функции. Это подпись формы Java_package_name_classname_funcname. Создайте файл заголовка, а затем убедитесь, что ваша подпись функции точно такая же.

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