Pi4J / pi4j-v1

DEPRECATED Java I/O library for Raspberry Pi (GPIO, I2C, SPI, UART)
http://www.pi4j.com
Apache License 2.0
1.31k stars 448 forks source link

Can't build dex file from pi4j-core.jar #470

Closed BotovNikita closed 4 years ago

BotovNikita commented 4 years ago

I try to deploy pi4j to Android project with FireMonkey in Rad Studio XE 10.2.3. I use dx.bat to convert jar to dex. All jar's convert ok, but pi4j-core.jar have error: C:\Users\Botov\AppData\Local\Android\Sdk\build-tools\29.0.2>dx --dex --output=D:\DEX_MAKER\output\dex\pi4j-core.dex --positions=lines D:\DEX_MAKER\jar\pi4j-core.jar Uncaught translation error: com.android.dx.cf.code.SimException: ERROR in com.pi4j.io.file.LinuxFile.mmap:(ILcom/pi4j/io/file/LinuxFile$MMAPProt;Lcom/pi4j/io/file/LinuxFile$MMAPFlags;I)Ljava/nio/ByteBuffer;: invalid opcode ba - invokedynamic requires --min-sdk-version >= 26 (currently 13) Uncaught translation error: com.android.dx.cf.code.SimException: ERROR in com.pi4j.io.i2c.impl.I2CBusImpl.readByteDirect:(Lcom/pi4j/io/i2c/I2CDevice;)I: invalid opcode ba - invokedynamic requires --min-sdk-version >= 26 (currently 13) 2 errors; aborting My version: C:\Users\Botov\AppData\Local\Android\Sdk\build-tools\29.0.2>C:\Users\Botov\AppData\Local\Android\Sdk\tools\lib\find_java32.exe C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe C:\Users\Botov\AppData\Local\Android\Sdk\build-tools\29.0.2>"C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe" -version java version "1.8.0_231" Java(TM) SE Runtime Environment (build 1.8.0_231-b11) Java HotSpot(TM) Client VM (build 25.231-b11, mixed mode) What can I do?

BotovNikita commented 4 years ago

I make it. Jast add --min-sdk-version=26 at start of command line, and it's works.

But now, when I use the lib, I am have an error: java.lang.UnsatisfiedLinkError: No implementation found for int con.pi4j.wiringpi.Gpio.wiringPiSetup() (tried Java_com_pi4j_wiring_Gpio_wiringPiSetup and Java_com_pi4j_wiring_GpiowiringPiSetup)

My code like:

....
procedure SetPin();
var
  gpio : JGpioController;
  pin :  JGpioPinDigitalOutput;
begin
  gpio := TJGpioFactory.JavaClass.getInstance;
...
savageautomate commented 4 years ago

Embedded inside the Pi4J Core JAR file is a native library file (libpi4j.so) that gets extracted at runtime and loaded into the JVM. I suspect in the case of Android something is going wrong with extracting and loading this native library. You may have to include the library file manually and include it as part of the java libraries path.