代码之家  ›  专栏  ›  技术社区  ›  Anthony

在没有GCJ-移动C到Java或Java到C的情况下结合Java和C?

  •  2
  • Anthony  · 技术社区  · 14 年前

    首先,我没有这样做的经验。但是就像任何一个好计划的开始一样,我有问题需要解决,所以我愿意学习。

    所以你们中的许多人可能已经熟悉pdftk,它是处理各种与pdf相关的任务的便利实用工具。据我所知,除了我需要的库/扩展(可能是它仍然存在的唯一原因)之外,这些功能中的大多数都有更新、更轻的库/扩展:将表单数据文件(FDF和XFDF)与表单PDF合并,并获得一个新文件作为输出。

    问题是我的服务器没有gcj,这是构建/编译pdftk的基础。我不知道是因为我在Solaris上还是因为其他系统管理员级别的原因,但我不会很快得到GCJ。据我所知,还没有为Solaris预编译的二进制文件。

    因此,我认为可以通过Javac直接重写make文件和C代码,以便直接导入Java库(非常古老的ITEXT版本)。

    但我不知道从哪里开始。我只知道:

    1. 当我完成时,我想要一个二进制文件,这样就不会在每次使用时都需要Java VM。
    2. 当前应用程序使用gcj。

    所以我的第一个想法是“哦,这很简单,我可以用其他基于C的方法来调用这些类”,但是我没有找到一个简单的方法来实现这一点,而是在各种角度上找到了大量的冗长的文章,这些文章都可以接近,等等。

    然后我在Sun网站找到了一个关于如何在Java类中调用其他语言(如C)的页面。但是这种方法的问题是:

    1. 我得写个包装纸
    2. 我可能会更好地跳过这一部分,用Java编写整个过程。
    3. 如果我能用已经存在的类导入类,我还没有准备好。
    4. 我不清楚是否可以在最后编译和获取二进制文件,或者每次我都被困在Java中。

    我再次为我的无知道歉。我只需要一些建议和例子,说明如何用Java直接替换GCJ依赖C代码。

    当然,如果我问其中一个“如果我们能做到,我们就已经富有了”类型的问题,请告诉我。

    2 回复  |  直到 14 年前
        1
  •  3
  •   KitsuneYMG    14 年前

    我不确定你到底在找什么,所以我提供了几个答案。


    如果有需要运行的Java代码,则必须:

    1. 在JVM中运行它。您可以在自己的自定义C代码中启动该VM,但它仍在使用一个JVM
    2. 用另一种语言重写它。
    3. 使用提前编译器(如gcj)编译

    顺便说一下,你可以在你的主文件夹中编译一个gcj的副本并使用它。我相信魔法开关是 --enable-languages=java,c (见: here 更多)


    如果你想从Java调用C代码,你有四个选项:

    1. Java本地接口(JNI)。你好像找到这个了
    2. Java本地访问(JNA)。这比JNI慢,但需要较少的编码,并且不需要包装器C代码。它需要一个罐子和一个图书馆
    3. 创建一个cli实用程序,并使用runtime.exec(…)来调用它。
    4. 使用某种进程间通信使Java代码要求C代码执行操作并返回结果。

    其他平台相关选项

    1. 使用Jacob(仅限win32:com访问)
        2
  •  0
  •   Luke Cycon    14 年前

    我不确定我是否明白你在找什么。

    如果你想把C代码结合到Java中,制作一个没有GCJ的本地二进制,我想你运气不好。您可以在Java中包含C,但它将主要是Java程序,意味着每次运行时都需要JVM。有什么东西阻止你自己编译GCJ吗?

    推荐文章