Java,一个无敌的存在!虽然C++程序员都很鄙视Java的运行效率,但仍然无可奈何地看着自己的阵地一点点地被Java攻占。
当然,在Java里面,已经有无数好用的可视化类库,CChart并没有什么特别突出的优势,本节课只是为了说明CChart在Java中是可用的。当然,易拓展可定制仍然可以作为CChart的特点。
CChart是Windows native的库,Java中调用原则上需要采用JNI,不过JNI使用起来比较繁琐,这里采用了JNA。
另外,CChart类库中存在的C++ Name mangling,使得JNA无法直接调用。为了解决这个问题,仍然需要利用前两节课采用的二次包装方法。
下面开始。
第一步,安装JNA。
这里采用的是32位版的CChart,JDK也是32位的。
JNA实际就两个文件,笨笨下载的是5.3.1版本,jna-5.3.1.jar和jna-platform-5.3.1.jar。
JNA的安装方法是把这两个文件的路径加文件名,添加到系统变量classpath里面。
第二步,用VC打开上一节课二次包装CChart库的Dll工程文件,在ChartWrapper.cpp里面,输入下面的代码,然后编译出CChartWrapperU.dll待用。
#pragma comment(linker, "/export:_CreateChart=CChartu.?CreateChart@Classless@@YAXXZ")
#pragma comment(linker, "/export:_DestroyChart=CChartu.?DestroyChart@Classless@@YAXXZ")
#pragma comment(linker, "/export:_Attach=CChartu.?Attach@Classless@@YAHPAUHWND__@@@Z")
#pragma comment(linker, "/export:_AddPoint2D=CChartu.?AddPoint2D@Classless@@YAHNNHH@Z")
#pragma comment(linker, "/export:_SetTitle=CChartu.?SetTitle@Classless@@YAXPB_W@Z")
#pragma comment(linker, "/export:_ReDraw=CChartu.?ReDraw@Classless@@YAXXZ")
第三步,利用任意文本编辑器,采用JFrame类库建立一个简单的Java窗口程序。记事本就可以了哟,哈哈。
import javax.swing.JFrame;
public class JavaWnd
{
public static void main(String[] args)
{
JFrame myWnd = new JFrame("Java Window");
myWnd.setLocation(100, 100);
myWnd.setSize(600, 450);
myWnd.setVisible(true);
myWnd.setResizable(false);
}
}
编译,运行,程序结果如图所示。
第四步,拷贝CChartWrapperU.dll和CChartu.dll两个文件。
第五步,导入JNA类库中相关的类。
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.WString;
第六步,基于JNA建立CChart的调用接口界面。
public interface CChartLib extends Library
{
CChartLib INSTANCE = (CChartLib)Native.loadLibrary("CChartWrapperU.dll",CChartLib.class);
public abstract void CreateChart();
public abstract int Attach(HWND hWnd);
public abstract int AddPoint2D(double x, double y, int nDataIndex, int nPlotIndex);
public abstract void SetTitle(WString title);
public abstract void ReDraw();
}
这里利用JNA,把前面DLL二次包装的函数写成Java可以直接调用的接口。
第七步,获得窗口的HWND指针。
在Windows下,Java窗口也是有HWND指针的,这使得CChart的使用成为可能。
Pointer p = Native.getComponentPointer(myWnd);
HWND h = new HWND(p);
第八步,通过JNA调用CChart API绘图。
CChartLib.INSTANCE.CreateChart();
CChartLib.INSTANCE.Attach(h);
for(int i=-10; i<=10; i++)
{
CChartLib.INSTANCE.AddPoint2D(i, i*i*i*i, 0, 0);
}
CChartLib.INSTANCE.SetTitle(new WString("Java标题"));
CChartLib.INSTANCE.ReDraw();
代码编制完成,效果如图。
在Java程序里,CChart的消息响应仍然正常。
对于Java环境中的使用,本节课仅做了一个简单的演示。