I am currently using JMonkeyEngine 3.1, and I’m having a problem deploying my game onto my Raspberry pi. I am using pi 2 model B (Quad-Core cortex A-7 900MHZ). I clean and build my project (with the default IDE build) I send it to the pi, then when I attempt to execute it, I get the current error:
Exception in thread “jME3 Main” java.lang.UnsatisfiedLinkError: /home/pi/javaTest/dist/libopenal.so.1: /home/pi/javaTest/dist/libopenal.so.1: cannot open shared object file: No such file or directory (Possible cause: can’t load IA 32-bit .so on a ARM-bit platform)
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1965)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1890)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1851)
at java.lang.Runtime.load0(Runtime.java:795)
at java.lang.System.load(System.java:1062)
at com.jme3.system.NativeLibraryLoader.loadNativeLibrary(NativeLibraryLoader.java:683)
at com.jme3.system.lwjgl.LwjglContext.loadNatives(LwjglContext.java:171)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:209)
at java.lang.Thread.run(Thread.java:745)
What happens is, when I execute my “MyGame.jar” file, it throws the error above, and it (it being the pi OS, or java, I’m not sure) generates a new libopenal.so file in the dist folder.
I’ve been researching hours for days and I’ve come up with this information:
JmonkeyEngine uses OpenGL 2 by default, Raspian Jessie (PI’s image) supports OpenGL ES (idk if these will clash…)
Raspian Jessie does not support water or post process filtering
It has to be Arm v7 Compatible
When I searched for Raspberry pi support, I found mostly how to turn your pi into a retro gaming console. I found nothing talking about deploying your own java 3d game.
I’ve also researched Gradle, but there are no JME3.1 native libraries available to Gradle as far as I could tell.
I’ve looked into Jazelle, but all I found were 3 year old forums and I didn’t find much that helped me.
I took out all unused imports, I added no audio nodes or anything coming close to audio in my code, I took out my water and ppf, I’ve tried 3 different iteration deploys on pi, but I still have no luck with it.
Is what I’m attempting to do even possible?
If so, what am I doing wrong? What am I missing?
I even attempted to research armv7 architecture, but not much luck there.
Any help is greatly appreciated Thanks!
Here is My code if it Helps,
//***********************************************
package mygame;
import com.jme3.animation.AnimChannel;
import com.jme3.animation.AnimControl;
import com.jme3.animation.AnimEventListener;
import com.jme3.animation.LoopMode;
import com.jme3.input.KeyInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.light.DirectionalLight;
import com.jme3.math.Vector3f;
import com.jme3.renderer.RenderManager;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.material.Material;
import com.jme3.app.SimpleApplication;
public class Main extends SimpleApplication implements AnimEventListener
{
public AnimChannel channel;
public AnimControl control;
public AnimChannel channel1;
Node player;
public static void main(String[] args)
{
Main app = new Main();
app.start();
}
@Override
public void simpleInitApp()
{
Spatial S = assetManager.loadModel("Models/Ninja/Ninja.mesh.xml");
S.scale(0.05f,0.05f,0.05f);
S.rotate(0.0f,-3.0f,-0.0f);
rootNode.attachChild(S);
DirectionalLight sun = new DirectionalLight();
sun.setDirection(new Vector3f(-1.0f,-0.7f,-1.0f));
rootNode.addLight(sun);
Spatial R = assetManager.loadModel("Models/Terrain_Smooth/Terrain_Smooth.j3o");
rootNode.attachChild(R);
try
{
player = (Node) assetManager.loadModel("Models/Wave/Cube.mesh.xml");
Material mat = new Material(assetManager,"Common/MatDefs/Misc/ShowNormals.j3md");
player.setMaterial(mat);
player.setLocalScale(0.5f);
rootNode.attachChild(player);
control = player.getControl(AnimControl.class);
control.addListener(this);
channel = control.createChannel();
channel.setAnim("Wave");
}
catch (Exception e)
{
System.out.println("Couldn't load Animation Model");
}
}
@Override
public void simpleUpdate(float tpf)
{
//TODO: add update code
}
@Override
public void simpleRender(RenderManager rm)
{
//TODO: add render code
}
public void onAnimCycleDone(AnimControl control, AnimChannel channel, String animName)
{
System.out.println("Made it to AnimCycle");
if (animName.equals("Wave"))
{
channel.setAnim("Wave", .50f);
channel.setLoopMode(LoopMode.DontLoop);
channel.setSpeed(1f);
}
}
public void onAnimChange(AnimControl control, AnimChannel channel, String animName)
{
}
public void initKeys()
{
inputManager.addMapping("Wave", new KeyTrigger(KeyInput.KEY_SPACE));
inputManager.addListener(actionListener, "Wave");
System.out.println("Made it to initKeys");
}
public ActionListener actionListener = new ActionListener()
{
public void onAction(String name, boolean keyPressed, float tpf)
{
if (name.equals("Wave") && !keyPressed)
{
if (!channel.getAnimationName().equals("Wave"))
{
channel.setAnim("Wave", 0.50f);
channel.setLoopMode(LoopMode.Loop);
System.out.println("Made it to 5");
}
}
}
};
}