【发布时间】: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