- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
gcj可以将Java代码编译成本地代码。我感兴趣的是,如果 Java 被编译成共享库,我们如何在 c/c++ 程序中使用库中的方法。
我没有成功。以下是我的尝试:
Java代码(将被编译成共享库):
// JavaLib.java
public class JavaLib {
public static void hello() {
System.out.println("Hello, in Java Lib");
}
}
编译:
$gcj -C JavaLib.java
$gcj -fPIC -c JavaLib.class
$gcj -shared -o libJavaLib.so JavaLib.o -lstdc++
生成标题:
$gcjh -cp=. JavaLib
C++ 中的库用户:
#include <stdio.h>
#include <dlfcn.h>
#include "JavaLib.h"
using namespace std;
int main(int argc, char **argv) {
void * handle = dlopen("./libJavaLib.so", RTLD_LAZY);
char * error;
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
}
void (*hello)();
hello = (void (*)())dlsym(handle, "JavaLib::hello");
if ((error = dlerror()) != NULL) {
fprintf(stderr, "%s\n", error);
}
hello();
dlclose(handle);
}
编译c++库用户:
$gcc -rdynamic -o CPPUser CPPUser.cpp -ldl
但是我在执行“CPPUser”时遇到了这个错误:
./libJavaLib.so: undefined symbol: JavaLib::hello
Segmentation fault
有人有想法吗?是否可以在c/c++程序中从gcj编译的Java native 代码中调用方法?
最佳答案
您可以使用 gcj 中的 jni 或 cni 选项来完成您的目标,并且您的代码既不是 cni 也不是 jni 代码..
无论如何,针对标准的 Java VM,gcj 提升了 cni...但必须添加,jni 意味着您可以将您的代码带到各种 VM 上
jni 的例子:
http://gcc.gnu.org/java/jni-comp.txt
cni 在这里解释:https://idlebox.net/2011/apidocs/gcc-4.6.0.zip/gcj-4.6.0/gcj_13.html
希望对您有所帮助?
关于java - 将c/c++与Java原生代码集成为共享库(gcj编译),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9272094/
我获得了属于空间引用 GCJ-02 的 LatLng。当然,它不会在谷歌地图中正确显示,因为我相信,如果我错了请纠正我,谷歌地图使用 WGS-84。 google map service v2 for
Code jam problem是以下内容: 给你一个完整的无向图,有 N 个节点和 K 个“禁止”边。 N <= 300, K <= 15。找出图中不使用任何 K 个“禁止”边的哈密顿循环数。 不幸
下面是一些简单的代码: class B {final static int x = C.x;} class C {final static int x = B.x;} class A { st
我正在尝试使用 gcj 构建 java 应用程序,但出现以下错误。自从我使用 gcj 以来已经有一段时间了(大约一年),所以我可能忘记了一些不明显的东西,但我很确定我一直都是这样做的。 multip
这个问题在这里已经有了答案: Is GNU's Java Compiler (GCJ) dead? [closed] (4 个答案) 关闭 7 年前。 我一直在寻找有关 GCJ 状态及其 futur
如何在 NetBeans 中使用 GCJ 编译器编译 Java 程序?有什么插件吗? 最佳答案 GCJ 是垃圾,抛弃它。除了最原始的 Java 代码,您无法使用它编译所有代码。 而且您不能将它集成到
我想将小型 Java 应用程序编译为 Windows 可执行文件。 应用程序很小,只有一个主类,但它使用 Apache POI。 当我编译它时,一切正常,只要我将 POI Jar 放入类路径参数中即可
这是我用 Java 编写的速度测试的结果: Java real 0m20.626s user 0m20.257s sys 0m0.244s GCJ real
我是 Linux 和一般编程的新手,我什至似乎无法运行简单的 Hello World 代码。以下是我所做的以及收到的错误,我正在使用 Cygwin。谁能帮我? theys@THEYS1 ~/java
我不知道这是否是在 StackOverflow 上提出的问题,但无论如何我都会问。 我在 Windows XP SP3 上使用 GCJ(作为 MinGW 的一部分)将 Java 类编译为 EXE。 J
我正在使用 Java 版本 4.4.4 的 gnu 编译器。它不支持 javax.swing.GroupLayout。以后的版本有这个支持吗?我之前在我的系统上多次构建过 GCC。我应该这样做吗? 最
我对 gcj 和 java 都很陌生,所以如果我遗漏了一些明显的东西,请原谅我。我正在尝试使用 gcj 编译 YUICompressor,但收到错误消息,指出找不到主类。我有: ~/java/yuic
我正在尝试在 CentOS 上安装一个软件,文档说的是这样的... If you are using a Linux distribution that installs GCJ by default
我试过GCJ它编译得很好。我尝试了 Ubuntu 和 Windows。编译后的文件以及带有 wine 的 .exe 在我的 Ubuntu 机器上运行。但是如果我尝试在我的 Ubuntu 服务器上运行,
我找不到 MinGW 的 gcj 二进制文件的链接;它没有出现在 MinGW-get 列表中,而且我在 the site 上找不到二进制文件。 . 它甚至存在吗?我在哪里可以找到它? 最佳答案 仅仅因
因为 Clojure 构建在 JVM 之上,我想我可以使用 GCJ将它直接编译成机器代码,但我找不到任何关于它的信息。 如果可能的话,我怎么能把它“剥离”成最基本的东西,这样启动时间和内存占用就尽可能
当我尝试在脚本的帮助下运行 java 应用程序时出现此异常 Caused by: java.lang.ClassNotFoundException: com.tata.topListQuoteSamp
目前(2009 年年中)GCJ 的现状如何? 最新消息是2007年的,所以我想知道是否有任何形式的进展?我记得不久前有一个可用的 lucene 编译版本,它使用 gcj 从 java 源代码编译它。目
我很抱歉,因为我是一个非常“Java 菜鸟”。无论如何,我认为我已经充分简化了这个问题,可以以一种直截了当的方式提出问题,并且会得到我想要的答案。假设我有两个文件,都在我的主目录中,如下所示: 测试.
是否可以使用 GCJ 编译用于 Java 的库,获取 dll 并从 python ctypes 调用? 我现在对 toxilibs 很感兴趣,但如果有人知道一个玩具示例那就太好了! 最佳答案 如果您想
我是一名优秀的程序员,十分优秀!