gcc编译java
要在java中调用c语言的库,需要使用Java提供了JNI。
举例说明
在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java中调用这个函数显示Hello Word.
现在分别从Java和C语言两部分说明:
1. Java 部分
首先定义一个HelloNative,在其中申明sayHello函数,函数要申明为Native 类型的.如下:
public class HelloNative {
public native void sayHello();
}
编译这个类,生成class文件:
javac HelloWorld.java
利用javah生成需要的h文件
javah HelloNative
生成的 h文件大概如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */
#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
可以看一下上面自动生成的程序,程序include了jni.h,这个头文件在 $JAVA_HOME下的include文件夹下. 还可以发现生成的函数名是在之前的函数名前面加上了Java_HelloNative。
2. C语言部分
根据上面生成的h文件编写相应的代码实现,建立一个 HelloNative.cpp用来实现显示Hello World的函数.如下:
#include <stdio.h>
#include "HelloNative.h"
JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)
{
printf("Hello World!\n");
}
代码编写完成之后,我们再用gcc编译成库文件,命令如下;
gcc -fPIC -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux -shared -o libHelloNative.so HelloNative.cpp
这样就会在当前目录下生成一个libHelloNative.so的库文件.这时需要的库已经生成,在C语言下的工作已经完成了.
接下来需要在Java中编写一个程序测试一下.在程序前,需要将我们的库载入进去.载入的方法是调用Java的 System.loadLibrary("HelloNative");
public class TestNative
{
static {
try {
System.loadLibrary("HelloNative");
}
catch(UnsatisfiedLinkError e) {
System.out.println( "Cannot load hello library:\n " + e.toString() );
}
}
public static void main(String[] args) {
HelloNative test = new HelloNative();
test.sayHello();
}
}
但是再编译后,运行的时候,问题又出现了.
Cannot load hello library:
java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path
Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V
at HelloNative.sayHello(Native Method)
at TestNative.main(TestNative.java:13)
载入库失败,但是库明明就是放在当前文件夹下的,怎么会载入失败呢?
用System.getProperty("java.library.path")查看,发现java.library.path中并不u存在当前的目录.主要有以下的几个解决办法:
1) 将生成的库复制到java.library.path有的路径中去,当然这样不是很好
2) 设置环境变量export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ,将当前的目录加入到LD_LIBRARY_PATH中
3) 设置java 的选项,将当前的目录加入到其中 .java -Djava.library.path=. $LD_LIBRARY_PATH
这样之后程序就能够成功的运行了.可以看见显示的"Hello World!"了
B. 请问linux下,gcc编译程序的过程(从读取源文件到制作可执行程序中间所有过程,越详细越好)
gcc -S *.c 预处理+反汇编
C. 用gcc能编译java吗
可以, gcc 编译器套件有很多命令;
其中gcc 可以用来编译c
gcj 可以用来编译java
D. gcc编译java程序
gcc不是编译C语言,C++语言之类的吗?gcc -x后面可加的参数只有:`c', `objective-c', `c-header', `c++', `cpp-output', `assembler', `assembler-with-cpp'. 所以编译不了java程序,要用专门的程序编译。
E. 如何用java调用gcc编译器,本人需要一个在java中调用gcc编译运行C程序,如何实现
我的电脑 属性 高级 环境变量
系统变量或用户变量 Path 中 添加 gcc的路径
C:\Dev-Cpp\bin
F. 如何用java调用gcc编译器编译程序
方法1:Runtime.getRuntime().exec();//执行本地命令,此方法是多态的
方法2:使用ProcessBuilder。
G. 用java做一个java的编译器
Javac编译器读取Java源代码,并将其编译成字节代码,说的直白一点就是把java语言翻译成计算机可以识别的二进制代码。
java的编译器有很多种,有sun公司的jdk,有oracle的jdk,还有其他一些公司的,多采用sun公司的jdk。
java同时需要集成开发环境,它集成了java的编译器,让我们不必通过命令行来编译java类文件,通过它我们可以快速的开发我们需要的程序。目前用的比较多的集成开发环境有eclipse和myeclipse,eclipse有很多具有针对性的版本来应对不同的开发,而myeclipse则是相对来说功能比较全面,当然也需要购买,个人建议myeclipse。
H. java调用windows命令行窗口执行GCC编译命令但是报错:GCC程序不能运行,怎么破
要么写成 .exec("gcc E:\\hello.c -o E:\\hello.exe");
要么用你的写法,但 gcc 要写上完整路径。
或者尝试 new String[] {"C:\\windows\\cmd.exe", "/c", "gcc", "E:\\hello.c", "-o", "E:\\hello.exe"};
反正打散成数组参数后,第一个参数必须是完整路径,不能只写短名。
在命令行运行 java 时加上 java -Duser.language=en_US 就可以看到那些问号到底是什么错误消息了,有利于找出问题。
I. 如何在mac下搭建C/C++,Java的编译环境
步骤如下:
1. Mac OS X 本身已经安装好 jdk,所以搭建 Java Eclipse环境很简单,只需要下载适合系统的 Eclipse即可,首先查看系统是几位的(点击 Mac 屏幕左上角的苹果 Logo,选择“关于本机”,在弹出的方形窗口里点击“更多信息…”按钮,再点击"系统报告…"按钮,在“软件”一栏就能看到目前你的苹果电脑 Mac OS X 系统是否开启 64 位运算了。)
2.下载 Eclipse( Java 和 C/C++的都需要)http://www.eclipse.org/downloads/
3.安装 gcc编译器 XCode(为 Eclipse Java集成 C/C++做准备)。
判断系统里是否已经安装 gcc编译器的方法是,打开一个终端窗口(在实用工具文件夹里),输入命令 g++,没有则输出 command not found,若安装了则输出 not input files。 XCode在 mac电脑的随机安装光盘里就有,最新版可以上苹果官网上下载(http://developer.apple.com/technologies/xcode.html),但是需要注册一个 Apple Developer帐号后才能下载。按照安装程序步骤进行安装就可以了。 安装完后打开xcode,Preferences里面有个Downloads里面有个components选项,里面有个command line tools 安装上即可。
4. Eclipse整合 Java与 C/C++
解压缩刚下载下来的两个版本Eclipse (注意放在不同的地方,防止因为文件名相同覆盖),然后将C/C++ 版本的Eclipse 里面的plugins 文件夹中的内容全部复制,粘贴到Java 版本的Eclipse 里面的plugins 文件夹下面(注意:不能覆盖已有的文件或文件夹),OK 工具都弄好了,现在就剩下测试了。
5. 先创建一个 Java工程
6. 创建一个 C++项目
7. 编译、运行程序
J. 用gcc能编译java吗
可以,
gcc
编译器套件有很多命令;
其中gcc
可以用来编译c
gcj
可以用来编译java