Java找不到本机方法的.so C库

Java找不到本机方法的.so C库,java,c,raspberry-pi,shared-libraries,sensors,Java,C,Raspberry Pi,Shared Libraries,Sensors,我已经访问了两个C本机方法,但是当我调用 System.loadLibrary("SensorReader"); 我明白了 我已经按照指南说明了我必须导出路径以使其临时工作,或者将.so库放在ld路径中。我甚至检查了java属性,得到了以下结果: java.library.path = . /usr/java/packages/lib/arm /lib /usr/lib 但是,即使我将SensorReader.so的副本放在这些目录中的任何一个(

我已经访问了两个C本机方法,但是当我调用

 System.loadLibrary("SensorReader");
我明白了

我已经按照指南说明了我必须导出路径以使其临时工作,或者将.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;
}
没有返回错误,并且创建了SensorReader.so文件,我只是在尝试运行Java时遇到了问题。
我不确定,但我认为。所以库是在执行时调用的,而不是在编译时调用的,但以防万一,我尝试了执行和编译,然后直接在目标Raspberry设备上执行代码,但没有任何更改。

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


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

显然,错误的地方在于“SensorReader.So”文件名之前缺少了“lib”

改变

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

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

# ldconfig

解决了这个问题,现在Java真的找到了这个库。

。我将检查第一行GCC中的选项意味着什么,也许它针对不同的体系结构进行编译。
$ gcc SensorReader.o -shared -o SensorReader.so -Wl,-soname,SensorReader
$ gcc SensorReader.o -shared -o libSensorReader.so -Wl,-soname,SensorReader
# ldconfig