在64位的樹莓派直接使用pi4j會(huì)出現(xiàn)java.lang.UnsatisfiedLinkError
主要是pi4j自帶的.so動(dòng)態(tài)庫是32位的缭乘。
因此要解決這個(gè)問題就需要編譯一個(gè)64位的動(dòng)態(tài)庫耿战。
為了方便起見,直接在樹莓派4b上編譯落包。
-
獲取源碼
git clone https://github.com/Pi4J/pi4j.git
查找其jni的地方在哪里部蛇。
發(fā)現(xiàn)是在pi4j-native
文件夾
一直進(jìn)入到pi4j-native/src/main/native
文件夾
-
編譯動(dòng)態(tài)庫
可以查看一些build.sh內(nèi)容發(fā)現(xiàn)是一個(gè)一鍵編譯的腳本。
包含和各種類型的板子咐蝇,但是我們不需要涯鲁,只編譯樹莓派的就行了
因此執(zhí)行腳本./build-raspberrypi.sh
其中可能會(huì)遇到,tree命令找不到有序,這個(gè)命令就是查看目錄結(jié)構(gòu)的抹腿,執(zhí)行到這一步其實(shí)已經(jīng)編譯完成了。
進(jìn)入lib/raspberrypi/dynamic
目錄里面有libpi4j.so
- 替換pi4j里的
libpi4j.so
從報(bào)錯(cuò)的地方可以看到旭寿,加載庫的地方是com.pi4j.util.NativeLibraryLoader
類
NativeLibraryLoader
主要是一些兼容和調(diào)試的類警绩。
可以看到它其實(shí)是把.so動(dòng)態(tài)庫,解壓到臨時(shí)文件夾盅称,然后再加載的肩祥。
最核心也就是調(diào)用系統(tǒng)自帶的庫加載方法System.load(target.toAbsolutePath().toString());
。
把libpi4j.so放在程序目錄缩膝。
System.load(new File("libpi4j.so").getAbsolutePath());//加載
雖然能使用了混狠,但是它報(bào)錯(cuò)仍然在,只能catch忽略掉了疾层。
或者直接替換pi4j-core-1.2.jar包里面的libpi4j.so将饺。
- 測(cè)試
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import static com.pi4j.io.gpio.RaspiPin.GPIO_25;
/**
* @author: luo
* @create: 2020-06-01 14:27
**/
public class Main {
public static void singlePinTest() throws Exception {
GpioController gpio = GpioFactory.getInstance();
GpioPinDigitalOutput pin = gpio.provisionDigitalOutputPin(GPIO_25);
for (int i = 0; i < 10; i++) {
System.out.println("current:" + pin.getState());
pin.toggle();
Thread.sleep(2500);
}
gpio.shutdown();
}
public static void main(String[] args) throws Exception {
singlePinTest();
System.exit(0);
}
}
運(yùn)行時(shí)使用gpio readall
命令查看pin25的狀態(tài)是變化的