我收到以下错误。请告诉我可能出错的地方。
线程“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
答案 0 :(得分:3)
据我所知,您不能将C ++实例函数用作JNI函数。运行时没有对C ++类实例的引用。
您可以尝试将Plc::Java_Plcio_open
声明为static
,这应该有效(但当然会带来一些影响)。
答案 1 :(得分:1)
抱歉,你做得非常错误。请查看JNI上的tutoorial或一些例子。
您应该使用本机方法在类上运行javah。这将生成带有函数声明的C / C ++头文件。它是Java_package_name_classname_funcname形式的签名。生成头文件,然后确保您的函数签名完全相同。
答案 2 :(得分:0)
首先,您可能尚未实现所有标头功能。
执行以下操作
1 - 浏览到.so目录 2 - 做:
$ ld libteste.so
并检查是否有任何未实现的功能:)