首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JNI: UnsatisfiedLinkError

JNI: UnsatisfiedLinkError
EN

Stack Overflow用户
提问于 2016-09-13 23:09:48
回答 1查看 739关注 0票数 0

我正在尝试测试一些将Java类与一些ROS功能集成在一起的JNI代码,并且我正在努力将Java方法正确地链接起来。我已经正确地根据JNI接口编译了本机代码(至少我认为是这样),但是在运行时,我在定义的第一个本机方法上得到了一个UnsatisifiedLinkError。在这一点上,我不确定根本原因是JVM没有正确地加载.so文件(在同一目录中,我已经尝试了-Djava.library.path=.),或者它是否成功地加载了它,并且没有正确地找到方法。

这条错误消息提供的信息太少了,有没有办法获得更多关于导致它的原因的信息?

我不反对张贴源代码,如果它会有帮助,尽管我必须做一些编辑之前,我可以上传它,所以我会等待,看看你们是否认为它可能是有帮助的。

Talker.java:

代码语言:javascript
复制
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:

代码语言:javascript
复制
#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();
}

和输出:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2016-09-15 22:19:13

我不知道为什么,但是稍微重构一下上面的代码就可以让它工作了。如果我将本机方法从主类中提取出来,并将它们放在一个单独的类中(这样就删除了本机方法上的静态修饰符),那么主类就会调用它,所有这些都链接在一起,并且工作得很好。我不确定,也不知道为什么,但我认为这些方法上的静态修饰符导致了一些问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39473400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档