【问题标题】:Java not finding .so C library for native methodsJava 找不到本地方法的 .so C 库
【发布时间】:2018-03-20 12:10:14
【问题描述】:

我已经关注this guide 访问了两个 C 原生方法,但是当我调用时

 System.loadLibrary("SensorReader");

我明白了

Exception in thread "main" java.lang.UnsatisfiedLinkError: no SensorReader in java.library.path

我按照指南解释了我必须导出路径以使其临时工作或将 .so 库放在 ld 路径中。我什至检查了 java 属性并得到了这个:

java.library.path = .
    /usr/java/packages/lib/arm
    /lib
    /usr/lib

但即使我将 SensorReader.so 的副本放在任何这些目录中(第一个甚至不存在),也没有任何变化。 这是我创建库时使用的 SensorReader.c 代码:

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <wiringPiI2C.h>
#include <wiringPi.h>
#include <string.h>

#include "HTU21D.h"
#include "SensorController.h"

JNIEXPORT jdouble JNICALL Java_SensorController_getCurrentTemperature
  (JNIEnv *env, jobject obj) {
    wiringPiSetup();
    int fd = wiringPiI2CSetup(HTU21D_I2C_ADDR);
    double temperature;
    getTemperature(fd, &temperature);
    return temperature;
}

JNIEXPORT jdouble JNICALL Java_SensorController_getCurrentHumidity
  (JNIEnv *env, jobject obj) {
    wiringPiSetup();
    int fd = wiringPiI2CSetup(HTU21D_I2C_ADDR);
    double humidity;
    getHumidity(fd, &humidity);
    return humidity;
}

执行

$ gcc -fPIC -c SensorReader.c -I $JAVA_HOME/include -I $JAVA_HOME/include/Linux
$ gcc SensorReader.o -shared -o SensorReader.so -Wl,-soname,SensorReader

没有返回错误并且创建了 SensorReader.so 文件,我只是在尝试运行 Java 时遇到问题。 我不确定,但我认为 .so 库是在执行时调用的,而不是在编译时调用的,但以防万一我既尝试执行又编译,然后直接在目标 Raspberry 设备上执行代码,没有任何改变。

【问题讨论】:

    标签: java c raspberry-pi shared-libraries sensors


    【解决方案1】:

    显然错误在于“SensorReader.so”文件名之前缺少“lib”。

    变化

    $ gcc SensorReader.o -shared -o SensorReader.so -Wl,-soname,SensorReader
    

    $ gcc SensorReader.o -shared -o libSensorReader.so -Wl,-soname,SensorReader
    

    或者只是重命名 .so 文件,然后将其移动到 /lib 并执行

    # ldconfig
    

    解决了问题,现在 Java 确实找到了库。

    【讨论】:

      【解决方案2】:

      只是一个长镜头:我在尝试使用 32 位 Java 虚拟机加载 64 位编译的本机库时遇到了类似的问题。您应该确保两者都是 64 位(或 32 位,如果它更适合您的需求)。

      在任何其他情况下,我都会再看看库路径。

      【讨论】:

      • .so 库当然是在 RPI 上编译的,如果我在 64x 笔记本电脑上编译的话,我猜 GCC 不会找到诸如wiringPI 之类的库。我会检查 GCC 第一行中的选项是什么意思,也许它会针对不同的架构进行编译。
      猜你喜欢
      • 2018-04-13
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      相关资源
      最近更新 更多