JNI Неудовлетворенная ошибка связи - PullRequest
0 голосов
/ 27 января 2010

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

Исключение в потоке "main" java.lang.UnsatisfiedLinkError: Plcio.open (Ljava / lang / String;) I в 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 ]

3 голосов
/ 04 февраля 2010

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

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

1 голос
/ 26 августа 2011

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

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

0 голосов
/ 03 марта 2010

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

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

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

$ ld libteste.so

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

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