How to compile JavaFrameBuffer correctly

  java, linux, raspberry-pi

Source: https://github.com/ttww/JavaFrameBuffer

The error:

pi@pi2 ~/jfb $ javah -d src/main/c -classpath bin org.tw.pi.framebuffer.FrameBuffer

Error: Could not find class file for ‘org.tw.pi.framebuffer.FrameBuffer’.

The fix:

#!/bin/sh
jniResult=libFrameBufferJNI.so
 
# Make sure to update these to your correct JDK path
jniJdkHeader=/opt/jdk/current/include
jniSysHeader=/opt/jdk/current/include/linux


rm "$jniResult"
echo "here is the correct compile command"
javah -d src/main/c -classpath src/main/java org.tw.pi.framebuffer.FrameBuffer
 
# rm src/main/c/org_tw_pi_framebuffer_FrameBuffer_ScreenPanel.h
# rm src/main/c/org_tw_pi_framebuffer_FrameBuffer_UpdateThread.h

echo "gcc"
gcc -Wall -O2 -o "$jniResult" -shared -I "$jniJdkHeader"  -I "$jniSysHeader" -I src/main/c src/main/c/FrameBuffer.c
echo
pwd
ls -la "$jniResult"
echo "done"

Compile the class, if you haven’t already:

javac -classpath src/main/java/ src/main/java/org/tw/pi/framebuffer/TestFrameBuffer.java

Execute the tester class:

LD_LIBRARY_PATH=. java -classpath src/main/java/ org.tw.pi.framebuffer.TestFrameBuffer

Example output:

Open with dummy_200x330 (10044216)
  width   200
  height  330
  bpp     0
Exception in thread "AWT-EventQueue-0" java.awt.HeadlessException:
No X11 DISPLAY variable was set, but this program performed an operation which requires it.
        at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:207)
        at java.awt.Window.<init>(Window.java:536)
        at java.awt.Frame.<init>(Frame.java:420)
        at javax.swing.JFrame.<init>(JFrame.java:225)
        at org.tw.pi.framebuffer.TestFrameBuffer$2.run(TestFrameBuffer.java:149)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
        at java.awt.EventQueue.access$400(EventQueue.java:97)
        at java.awt.EventQueue$3.run(EventQueue.java:697)
        at java.awt.EventQueue$3.run(EventQueue.java:691)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

You need a window manager such as XMing:

Using XMing: