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