如何从jar文件创建C库? - java

我有一个图书馆的jar文件,其中的内容是一堆.class文件

spl
├── acm
│   ├── graphics
│   │   ├── DrawLineElement.class
│   │   ├── EndRegionElement.class
│   │   ├── FinalPathElement.class
│   │   ├── G3DRect.class
│   │   ├── GArc.class
│   │   ├── GCanvas.class
│   │   ├── GCanvasListener.class
│   │   ├── GCompound.class
│   │   ├── GContainer.class
│   │   ├── GDimension.class
│   │   ├── GFillable.class
│   │   ├── GImage.class
│   │   ├── GIterator.class
│   │   ├── GLabel.class
│   │   ├── GLine.class
│   │   ├── GMath.class
│   │   ├── GMouseEvent.class
│   │   ├── GObject.class
│   │   ├── GObjectList.class
│   │   ├── GOval.class
│   │   ├── GPen.class
│   │   ├── GPoint.class
│   │   ├── GPolygon.class
│   │   ├── GRectangle.class
│   │   ├── GRect.class
│   │   ├── GResizable.class
│   │   ├── GRoundRect.class
│   │   ├── GScalable.class
│   │   ├── GTurtle.class
│   │   ├── PathElement.class
│   │   ├── PathList.class
│   │   ├── PathState.class
│   │   ├── PenImage.class
│   │   ├── SetColorElement.class
│   │   ├── SetLocationElement.class
│   │   ├── StartRegionElement.class
│   │   └── VertexList.class
│   ├── gui
│   │   ├── DoubleField.class
│   │   ├── HPanel.class
│   │   ├── IntField.class
│   │   ├── TableConstraints.class
│   │   ├── TableLayout.class
│   │   ├── TablePanel.class
│   │   └── VPanel.class
│   ├── io
│   │   ├── AWTBooleanInputDialog.class
│   │   ├── AWTDialog.class
│   │   ├── AWTDialogModel.class
│   │   ├── AWTIconCanvas.class
│   │   ├── AWTLineInputDialog.class
│   │   ├── AWTMessageCanvas.class
│   │   ├── AWTMessageDialog.class
│   │   ├── CharacterQueue.class
│   │   ├── ConsoleActionListener.class
│   │   ├── ConsoleInputMonitor.class
│   │   ├── ConsoleModel.class
│   │   ├── ConsoleOutputMonitor.class
│   │   ├── ConsoleReader.class
│   │   ├── ConsoleWriter.class
│   │   ├── DialogModel.class
│   │   ├── IOConsole.class
│   │   ├── IODialog.class
│   │   ├── IOModel.class
│   │   ├── StandardConsoleModel.class
│   │   ├── SwingDialogModel.class
│   │   ├── SystemConsole.class
│   │   └── SystemConsoleModel.class
│   ├── program
│   │   ├── AppletStarter.class
│   │   ├── CommandLineProgram.class
│   │   ├── CommandLineProgramLoader.class
│   │   ├── ConsoleProgram.class
│   │   ├── DefaultActionListener.class
│   │   ├── DialogProgram.class
│   │   ├── GObjectProgram.class
│   │   ├── GProgramListener.class
│   │   ├── GraphicsProgram.class
│   │   ├── OldStyleCheckBoxMenuItem.class
│   │   ├── OldStyleMenuItem.class
│   │   ├── ProgramActionListener.class
│   │   ├── ProgramAppletStub.class
│   │   ├── Program.class
│   │   ├── ProgramContentPaneLayout.class
│   │   ├── ProgramFrame.class
│   │   ├── ProgramMenuBar.class
│   │   ├── ProgramMenuBarListener.class
│   │   ├── ProgramStartupListener.class
│   │   └── ProgramWindowListener.class
│   └── util
│       ├── Animator.class
│       ├── Base64OutputStream.class
│       ├── BMPImageSaver.class
│       ├── CancelledException.class
│       ├── DirectGif89Frame.class
│       ├── DOSCommandLine.class
│       ├── EmptyContainer.class
│       ├── EPSImageSaver.class
│       ├── ErrorException.class
│       ├── ExportAppletDialog.class
│       ├── FileChooserFilter.class
│       ├── Gif89Encoder.class
│       ├── Gif89Frame.class
│       ├── GIF89ImageSaver.class
│       ├── Gif89Put.class
│       ├── GifColorTable.class
│       ├── GIFImageSaver.class
│       ├── GifPixelsEncoder.class
│       ├── HexByteOutputStream.class
│       ├── HexInputStream.class
│       ├── ImageSaver.class
│       ├── IndexGif89Frame.class
│       ├── JPEGImageSaver.class
│       ├── JPGImageSaver.class
│       ├── JTFTools.class
│       ├── MailStream.class
│       ├── MediaTools.class
│       ├── NullAudioClip.class
│       ├── NullOutputStream.class
│       ├── OptionTable.class
│       ├── PICImageSaver.class
│       ├── PICTImageSaver.class
│       ├── Platform.class
│       ├── PNGImageSaver.class
│       ├── ProgressBarDialog.class
│       ├── RandomGenerator.class
│       ├── ReverseColorMap.class
│       ├── ReverseColorMap$ColorRecord.class
│       ├── RTFImageSaver.class
│       ├── SecurityManagerThatFails.class
│       ├── SoundClip.class
│       ├── SoundPlayer.class
│       ├── SpeedBarListener.class
│       ├── SubmitOptions.class
│       ├── SunAudioClip.class
│       ├── SwingTimer.class
│       ├── ThreadedMenuAction.class
│       ├── TIFFImageSaver.class
│       ├── TIFImageSaver.class
│       └── TokenScanner.class
├── META-INF
│   └── MANIFEST.MF
└── stanford
    └── spl
        ├── File_openFileDialog.class
        ├── G3DRect_create.class
        ├── G3DRect_setRaised.class
        ├── GArc_create.class
        ├── GArc_setFrameRectangle.class
        ├── GArc_setStartAngle.class
        ├── GArc_setSweepAngle.class
        ├── GButton.class
        ├── GButton_create.class
        ├── GCheckBox.class
        ├── GCheckBox_create.class
        ├── GCheckBox_isSelected.class
        ├── GCheckBox_setSelected.class
        ├── GChooser_addItem.class
        ├── GChooser.class
        ├── GChooser_create.class
        ├── GChooser_getSelectedItem.class
        ├── GChooser_setSelectedItem.class
        ├── GCompound_add.class
        ├── GCompound_create.class
        ├── GEvent_getNextEvent.class
        ├── GEvent_waitForEvent.class
        ├── GImage_create.class
        ├── GInteractor.class
        ├── GInteractor_getSize.class
        ├── GInteractor_setActionCommand.class
        ├── GLabel_create.class
        ├── GLabel_getFontAscent.class
        ├── GLabel_getFontDescent.class
        ├── GLabel_getGLabelSize.class
        ├── GLabel_setFont.class
        ├── GLabel_setLabel.class
        ├── GLine_create.class
        ├── GLine_setEndPoint.class
        ├── GLine_setStartPoint.class
        ├── GObject_contains.class
        ├── GObject_delete.class
        ├── GObject_getBounds.class
        ├── GObject_remove.class
        ├── GObject_rotate.class
        ├── GObject_scale.class
        ├── GObject_sendBackward.class
        ├── GObject_sendForward.class
        ├── GObject_sendToBack.class
        ├── GObject_sendToFront.class
        ├── GObject_setColor.class
        ├── GObject_setFillColor.class
        ├── GObject_setFilled.class
        ├── GObject_setLineWidth.class
        ├── GObject_setLocation.class
        ├── GObject_setSize.class
        ├── GObject_setVisible.class
        ├── GOval_create.class
        ├── GPolygon_addVertex.class
        ├── GPolygon_create.class
        ├── GRect_create.class
        ├── GRoundRect_create.class
        ├── GSlider.class
        ├── GSlider_create.class
        ├── GSlider_getValue.class
        ├── GSlider_setValue.class
        ├── GTextField.class
        ├── GTextField_create.class
        ├── GTextField_getText.class
        ├── GTextField_setText.class
        ├── GTimer.class
        ├── GTimer_create.class
        ├── GTimer_deleteTimer.class
        ├── GTimer_pause.class
        ├── GTimer_startTimer.class
        ├── GTimer_stopTimer.class
        ├── GWindow_addToRegion.class
        ├── GWindow_clear.class
        ├── GWindow_close.class
        ├── GWindow_create.class
        ├── GWindow_delete.class
        ├── GWindow_draw.class
        ├── GWindow_exitGraphics.class
        ├── GWindow_getScreenHeight.class
        ├── GWindow_getScreenWidth.class
        ├── GWindow_repaint.class
        ├── GWindow_requestFocus.class
        ├── GWindow_setRegionAlignment.class
        ├── GWindow_setResizable.class
        ├── GWindow_setTitle.class
        ├── GWindow_setVisible.class
        ├── JavaBackEnd.class
        ├── JBECanvas.class
        ├── JBECommand.class
        ├── JBEConsole.class
        ├── JBEConsole_clear.class
        ├── JBEConsole_getLine.class
        ├── JBEConsole_print.class
        ├── JBEConsole_println.class
        ├── JBEConsole_setFont.class
        ├── JBEConsole_setSize.class
        ├── JBEFileFilter.class
        ├── JBELabel.class
        ├── JBEWindow.class
        ├── Sound_create.class
        ├── Sound_delete.class
        ├── Sound_play.class
        ├── TopCompound.class
        └── TopCompound_create.class

是否可以从该jar文件创建一个C库,以便我可以在我的C应用程序中包括,链接和使用它?如果是,那怎么办?

值得一提的是,我可以根据文档here访问该库的所有头文件。

提前致谢!

参考方案

您正在寻找Java本机接口(JNI):

https://en.wikipedia.org/wiki/Java_Native_Interface
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/

您需要将JNI调用包装到您构建的C库接口中。

特别要看一看允许C语言程序启动Java JVM并执行Java函数的调用API:

http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html

Maven将生成的文件夹(使用Maven插件)添加为源文件夹,IntelliJ无法识别 - java

在我的maven Web项目中,cxf-codegen-plugin生成JAVA类并将其放入文件夹中 ${basedir}/src/generated 我在Java类中使用这些生成的类,src/main/java 我正在使用IntelliJ IDE,并且IntelliJ似乎无法识别${basedir}/src/generated 作为源文件夹(是正确的)。我…

子类可以创建抽象的超类类型的对象吗? - java

我不确定我是否正确问了这个问题,但我是在作业中给我的ClassA是抽象的B类扩展了A类那么在ClassB的主要方法中,我们有:ClassA obj =新的ClassB();这里发生了什么,这样做的目的是什么? 参考方案 您永远无法创建来自抽象类的对象。曾经期。在这里,被分配了对象的变量是抽象类型,但是变量所指的对象本身不是,也永远不可能是。引用和引用变量之间…

使用JIT进行的优化是否只发生一次,并且可以永久保留,或者仅在运行的生命周期中保留? - java

我在Just-in-time compilers上阅读过不同的文章,并且提到JIT将代码片段(热点)优化为直接的本机代码(机器代码)。我的问题是每当我运行.class file时,都会发生这种优化吗?另一方面,传统的compiled代码会一劳永逸地进行优化,而不仅仅是在一个execution中进行优化。在hot-spot optimization中如何“记住…

从对象转换为原始类 - java

我将Entry类的实例存储在Object中。Entry newentry = new Entry(j, 0.0); Object test = newentry; 如何将test对象转换回Entry类以访问Entry类方法getValue()? 参考方案 输入它:Entry newentry = new Entry(j, 0.0); Entry test =…

对Java接口实现的怀疑 - java

interface Device { public void doIt(); } public class Electronic implements Device { public void doIt() { } } abstract class Phone1 extends Electronic { } abstract class Phone2 ext…