Java找不到本机方法的.so C库
我已经访问了两个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的副本放在这些目录中的任何一个(
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