How to use jzy3d in android using eclipse?

2020-05-03 09:45发布

问题:

Hi. I want to create a 3dplot graph in android. I want to use jzy3d lib and found this example for beginning.

import org.jzy3d.chart.Chart;
import org.jzy3d.colors.Color;
import org.jzy3d.colors.ColorMapper;
import org.jzy3d.colors.colormaps.ColorMapRainbow;
import org.jzy3d.maths.Range;
import org.jzy3d.plot3d.builder.Builder;
import org.jzy3d.plot3d.builder.Mapper;
import org.jzy3d.plot3d.builder.concrete.OrthonormalGrid;
import org.jzy3d.plot3d.primitives.Shape;
import org.jzy3d.plot3d.rendering.canvas.Quality;
import org.jzy3d.ui.ChartLauncher;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Mapper mapper = new Mapper() {
        public double f(double x, double y) {
            return 10 * Math.sin(x / 10) * Math.cos(y / 20) * x;
        }
    };

    // Define range and precision for the function to plot
    Range range = new Range(-150, 150);
    int steps = 50;

    // Create a surface drawing that function
    Shape surface = (Shape) Builder.buildOrthonormal(new OrthonormalGrid(range, steps, range, steps), mapper);
    surface.setColorMapper(new ColorMapper(new ColorMapRainbow(), surface.getBounds().getZmin(), surface.getBounds().getZmax()));
    surface.setFaceDisplayed(true);
    surface.setWireframeDisplayed(false);
    surface.setWireframeColor(Color.BLACK);

    // Create a chart and add the surface
    Chart chart = new Chart(Quality.Advanced);
    chart.getScene().getGraph().add(surface);
    ChartLauncher.openChart(chart);
}

but when I want to run it it gives this error message:

05-29 20:10:16.685: E/AndroidRuntime(20113): java.lang.NoClassDefFoundError: org.jzy3d.plot3d.rendering.canvas.CanvasAWT     

and of course i add jzy3d , jogl , swt , gluegen libs to my project.

回答1:

AWT isn't supported under Android. Moreover, you use "jogl.jar" which comes from JOGL 1 whereas JOGL supports Android only since its second version. Please use a more recent version of Jzy3D and do the same for JOGL and GlueGen. As far as I know, Jzy3D 0.8 doesn't support Android.



回答2:

JOGL2, the underlying framework for Jzy3d 0.9.x rendering allows deploying on Android so Jzy3d will be able to do so.

For Android, there's a requirement to have no dependency on AWT, which is made feasable by ignoring the src/awt in jzy3d main library (ignoring swing and swt should be a good idea as well). Jzy3d has its own equivalents for AWT Rectangle & the likes so it will still build. You will have to derive CanvasNewtAwt [1] to make it work with Android (see [2] and [3]). You'll also want to see how maven poms select awt and swing source [4].

[1] http://doc.jzy3d.org/javadoc/0.9.1/jzy3d-api/org/jzy3d/plot3d/rendering/canvas/CanvasNewtAwt.html

[2] http://forum.jogamp.org/Migrate-a-Java-application-using-Jogl-to-Android-tablet-td3732586.html

[3] http://jogamp.org/jogl/doc/NEWT-Overview.html

[4] https://github.com/jzy3d/jzy3d-api/blob/master/jzy3d-api/pom.xml