我正在尝试测试一些将Java类与一些ROS功能集成在一起的JNI代码,并且我正在努力将Java方法正确地链接起来。我已经正确地根据JNI接口编译了本机代码(至少我认为是这样),但是在运行时,我在定义的第一个本机方法上得到了一个UnsatisifiedLinkError。在这一点上,我不确定根本原因是JVM没有正确地加载.so文件(在同一目录中,我已经尝试了-Djava.library.path=.),或者它是否成功地加载了它,并且没有正确地找到方法。
这条错误消息提供的信息太少了,有没有办法获得更多关于导致它的原因的信息?
我不反对张贴源代码,如果它会有帮助,尽管我必须做一些编辑之前,我可以上传它,所以我会等待,看看你们是否认为它可能是有帮助的。
Talker.java:
public class Talker {
/**
* ROS Native methods
*
* Simple passthrough to the C++ native methods in the ROS layer
*/
private static native void rosAdvertise();
private static native void rosPublish();
private static native void rosSpinOnce();
{
System.loadLibrary("ros-test-native-talker");
}
public static void main(String[] args) {
rosAdvertise();
while (true) {
rosPublish();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
rosSpinOnce();
}
}
}ros-test-native-talker.cpp:
#include "test_rostest_Talker.h"
#include "ros/ros.h"
#include "std_msgs/Time.h"
ros::Publisher outbound;
JNIEXPORT void JNICALL Java_test_rostest_Talker_rosAdvertise
(JNIEnv *, jclass) {
int argc = 0;
char **argv;
ros::init(argc, argv, "ros-native-timing-tester");
ros::NodeHandle n;
outbound = n.advertise<std_msgs::Time>("chatter", 1000);
}
JNIEXPORT void JNICALL Java_test_rostest_Talker_rosPublish
(JNIEnv *, jclass) {
ros::Time tx_timestamp = ros::Time::now();
ROS_INFO("Sending message at %d.%d", tx_timestamp.sec, tx_timestamp.nsec);
std_msgs::Time msg;
msg.data = tx_timestamp;
outbound.publish(msg);
}
JNIEXPORT void JNICALL Java_test_rostest_Talker_rosSpinOnce
(JNIEnv *, jclass) {
ros::spinOnce();
}和输出:
rush@lubuntu64vm:~/javarostest$ java -Djava.library.path=. -cp ros-test-native-1.0-SNAPSHOT.jar test.rostest.Talker
Exception in thread "main" java.lang.UnsatisfiedLinkError: test.rostest.Talker.rosAdvertise()V
at test.rostest.Talker.rosAdvertise(Native Method)
at test.rostest.Talker.main(Talker.java:21)发布于 2016-09-15 22:19:13
我不知道为什么,但是稍微重构一下上面的代码就可以让它工作了。如果我将本机方法从主类中提取出来,并将它们放在一个单独的类中(这样就删除了本机方法上的静态修饰符),那么主类就会调用它,所有这些都链接在一起,并且工作得很好。我不确定,也不知道为什么,但我认为这些方法上的静态修饰符导致了一些问题。
https://stackoverflow.com/questions/39473400
复制相似问题