常用的就是Eclipse,My Eclipse,idea這三種,My Eclipse相對於其他兩種不是很常用
⑵ 如何用java調用c語言編譯器實現在線編譯c語
要在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!"了
⑶ 如何用java實現一個文本編譯器
JDK自帶一個簡單的Notepad,你可以研究一下他的源代碼。
在%JAVA_HOME%\demo\jfc\Notepad 目錄下
JDK自帶一個稍復雜的Stylepad,你可以研究一下他的源代碼。
在%JAVA_HOME%\demo\jfc\Stylepad目錄下
⑷ java語言編譯器是怎樣編寫的,源代碼是什麼
編譯器
本身就是一個應用程序,編譯器涉及到底層的一些操作,對執行要求比較高的地方使用匯編語言編寫的,主要的還是用C語言來編寫實現的,在Java的安裝路徑下的bin目錄下有很多的*.exe可執行文件,像jar.exe、javac.exe、java.exe等等,Java編譯器這東西它好像不是開源的,如果你對編譯器的實現感興趣的話,推薦你看一本《
編譯原理
》這本書,這本書對你了解編譯器的實現原理有很大的幫助的。
⑸ 用Java可以寫C語言編譯器嗎
用java是可以寫語言編譯器的,用任何語言工具寫都可以。 各語言開發工具間只有開發效率的差異,沒有可行不可行的區別。
編譯器其實就是一個翻譯工具,它可以把代碼直接翻譯成二進制文件交給CPU執行(二進制指令就是CPU的指令集,當然可以直接操作內存),當然,這個二進制文件需要符合操作系統的可執行文件的格式(PE格式或ELF格式)才能執行。
換個角度理解:
linux gcc實際上就是一個工具集合,包含編譯器,匯編器,連接器等
編譯器就是把c語言程序翻譯為一種叫做目標文件的中間表示形式,然後交給匯編器,翻譯為匯編程序,而匯編執行直接對應二進制機器碼,鏈接之後就可以變成可執行文件了。
而用java實現的編譯器完全可以代替gcc工具集合中的編譯器,生成相同的目標文件的中間表示形式,在交給gcc匯編器,連接器等處理。
⑹ JAVA的編譯器有哪些
JCreater 、JBuilder、eclipse、myeclipse、netbean這幾個是主流,eclipse和myeclipse(eclipse的擴展功能更多)是主流中的主流
⑺ 初學java 用什麼編譯器
一 eclipse / myeclipse
當年學習java,最先接觸到的就是 eclipse。喔了個噻,當時感覺eclipse好牛啊,有好多先進的功能:
1. 可以方便地進行包管理。可視化窗口,創建目錄和文件都很方便,移動包,復制包等都可以方便的進行。
2.熱鍵操作。復制保存啥的就不說了,代碼提示這個功能還是很不錯的,在寫著寫著,腦子突然短路的時候,可以通過快捷鍵把腦子快速帶回來。
3.代碼調試。有時候,寫著寫著代碼,突然間就報錯了,不知道哪裡錯了,咋整,這時候,如果使用編輯器的話,就可以使用 debug模式進行調試了,找出問題所在,解決問題。
4.一些代碼管理等插件。在企業中肯定要用到代碼同步工具,svn 或者 git , 在編輯器中會提供這樣的插件,方便代碼的管理。
二 idea
相比 eclipse 和 myeclipse ,idea 的基本功能差不多。
1. 包管理:也是有方便的包和資源管理。
2.熱鍵:也是提供熱鍵管理的,而且還很好用。
3.代碼調試:debug模式用起來也是很舒服。
4.插件方面:也是支持一些插件的,如 熱部署插件等。
三 比較
1. 操作:兩個軟體有不同的快捷鍵,雖然idea兼容部分eclipse快捷鍵,但是不建議這樣做。
2.資源消耗:idea更能吃內存啊呦喂,電腦配置低的傷不起啊。eclipse要更柔和一點。
3.是否免費:eclipse 是免費的,myeclipse和idea 是要付費的呦。但是嘛,你懂得。
4.專業性:idea 應該是更專業的,有更高的代碼更新機制和代碼提示功能。但是 eclipse 涉及的范圍更廣,除了java 和可以編輯其他語言的項目。
四 建議
1. 如果電腦配置比較低,建議使用 eclipse ,並且使用較低版本的,這樣,電腦不會太吃力。如果配置比較高,比如,16G內存,固態硬碟,那就使用idea吧。
2. 沒有最好的編輯器,只有最適合自己的編輯器。任何一個編輯器用習慣了,都是很不錯的。
希望對您有所幫助!~
⑻ 用java做文本編譯器
給你個簡單的記事本代碼,自己看著修改吧!
package com.csk.notepad;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class MyNotepad implements ActionListener {
private JFrame frame = new JFrame("Notepad By ChenXiaoKang");
private JTextArea jta = new JTextArea();
private String result = "";
private boolean flag = true;
private File f;
private JButton jb = new JButton("開始");
private JTextField jtf = new JTextField(15);
private JTextField jt = new JTextField(15);
private JButton jbt = new JButton("替換為");
private JButton jba = new JButton("全部替換");
private Icon ic = new ImageIcon("D:\\java課堂筆記\\GUI\\11.gif");
private String value;
private int start = 0;
private JFrame jf = new JFrame("查找");
private JFrame jfc = new JFrame("替換");
@Override
public void actionPerformed(ActionEvent e) {
String comm = e.getActionCommand();
if ("新建".equals(comm)) {
if (!(frame.getTitle().equals("新記事本"))) {
if (!flag) {
write();
newNew();
} else {
JFileChooser jfc = new JFileChooser("D:\\java課堂筆記");
int returnVal = jfc.showDialog(null, "保存為");
if (returnVal == JFileChooser.APPROVE_OPTION) {// 選擇文件後再執行下面的語句,保證了程序的健壯性
f = jfc.getSelectedFile();
flag = false;
write();
}
}
} else if (!(jta.getText().isEmpty())) {
JFileChooser jfc = new JFileChooser("D:\\java課堂筆記");
int returnVal = jfc.showDialog(null, "保存為");
if (returnVal == JFileChooser.APPROVE_OPTION) {// 選擇文件後再執行下面的語句,保證了程序的健壯性
f = jfc.getSelectedFile();
flag = false;
write();
newNew();
}
} else {
newNew();
}
} else if ("打開".equals(comm)) {
JFileChooser jfc = new JFileChooser("D:\\java課堂筆記");
jfc.setDialogType(JFileChooser.OPEN_DIALOG);
int returnVal = jfc.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {// 選擇文件後再執行下面的語句,保證了程序的健壯性
f = jfc.getSelectedFile();
frame.setTitle(f.getName());
result = read();
flag = false;
value = result;
jta.setText(result);
}
} else if ("保存".equals(comm)) {
JFileChooser jfc = new JFileChooser("D:\\java課堂筆記");
if (flag) {
int returnVal = jfc.showDialog(null, "保存為");
if (returnVal == JFileChooser.APPROVE_OPTION) {// 選擇文件後再執行下面的語句,保證了程序的健壯性
f = jfc.getSelectedFile();
flag = false;
write();
}
} else {
write();
}
} else if ("另存".equals(comm)) {
JFileChooser jfc = new JFileChooser("D:\\java課堂筆記");
int returnVal = jfc.showDialog(null, "另存");
if (returnVal == JFileChooser.APPROVE_OPTION) {// 選擇文件後再執行下面的語句,保證了程序的健壯性
f = jfc.getSelectedFile();
write();
}
} else if ("退出".equals(comm)) {
System.exit(0);
} else if ("撤銷".equals(comm)) {
jta.setText(value);
} else if ("剪切".equals(comm)) {
value = jta.getText();
jta.cut();
} else if ("復制".equals(comm)) {
jta.();
} else if ("粘貼".equals(comm)) {
value = jta.getText();
jta.paste();
} else if ("刪除".equals(comm)) {
value = jta.getText();
jta.replaceSelection(null);
} else if ("全選".equals(comm)) {
jta.selectAll();
} else if ("查找".equals(comm)) {
value = jta.getText();
jf.add(jtf, BorderLayout.CENTER);
jf.add(jb, BorderLayout.SOUTH);
jf.setLocation(300, 300);
jf.pack();
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
} else if ("替換".equals(comm)) {
value = jta.getText();
GridLayout gl = new GridLayout(3, 3);
JLabel jl1 = new JLabel("查找內容:");
JLabel jl2 = new JLabel("替換為:");
jfc.setLayout(gl);
jfc.add(jl1);
jfc.add(jtf);
jfc.add(jb);
jfc.add(jl2);
jfc.add(jt);
jfc.add(jbt);
JLabel jl3 = new JLabel();
JLabel jl4 = new JLabel();
jfc.add(jl3);
jfc.add(jl4);
jfc.add(jba);
jfc.setLocation(300, 300);
jfc.pack();
jfc.setVisible(true);
jfc.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
} else if ("版本".equals(comm)) {
JDialog jd = new JDialog(frame, "關於對話框");
jd.setSize(200, 200);
JLabel l = new JLabel("哈哈哈哈哈哈哈哈哈哈呵呵呵呵呵呵呵呵呵呵呵呵呵");
jd.add(l, BorderLayout.CENTER);
jd.setLocation(100, 200);
jd.setSize(300, 300);
jd.setVisible(true);
// jd.pack();
jd.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
} else if ("開始".equals(comm) || "下一個".equals(comm)) {
String temp = jtf.getText();
int s = value.indexOf(temp, start);
if (value.indexOf(temp, start) != -1) {
jta.setSelectionStart(s);
jta.setSelectionEnd(s + temp.length());
jta.setSelectedTextColor(Color.GREEN);
start = s + 1;
jb.setText("下一個");
// value=value.substring(s+temp.length());//不能截取字串
} else {
JOptionPane.showMessageDialog(jf, "查找完畢!", "提示", 0, ic);
jf.dispose();
}
} else if ("替換為".equals(comm)) {
String temp = jtf.getText();
int s = value.indexOf(temp, start);
if (value.indexOf(temp, start) != -1) {
jta.setSelectionStart(s);
jta.setSelectionEnd(s + temp.length());
jta.setSelectedTextColor(Color.GREEN);
start = s + 1;
jta.replaceSelection(jt.getText());
} else {
JOptionPane.showMessageDialog(jf, "查找完畢!", "提示", 0, ic);
jf.dispose();
}
} else if ("全部替換".equals(comm)) {
String temp = jta.getText();
temp = temp.replaceAll(jtf.getText(), jt.getText());
jta.setText(temp);
}
}
public String read() {
String temp = "";
try {
FileInputStream fis = new FileInputStream(f.getAbsolutePath());
byte[] b = new byte[1024];
while (true) {
int num = fis.read(b);
if (num == -1)
break;
temp = temp + new String(b, 0, num);
}
fis.close();
} catch (Exception e1) {
e1.printStackTrace();
}
return temp;
}
public void write() {
try {
FileOutputStream fos = new FileOutputStream(f);
fos.write(jta.getText().getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void newNew() {
frame.dispose();
new MyNotepad();
flag = true;
}
public MyNotepad() {
JMenuBar jmb = new JMenuBar();
String[] menuLab = { "文件", "編輯", "幫助" };
String[][] menuItemLab = { { "新建", "打開", "保存", "另存", "退出" },
{ "撤銷", "剪切", "復制", "粘貼", "刪除", "全選", "查找", "替換" }, { "版本" } };
for (int i = 0; i < menuLab.length; i++) {
JMenu menu = new JMenu(menuLab[i]);
jmb.add(menu);
for (int j = 0; j < menuItemLab[i].length; j++) {
JMenuItem jmi = new JMenuItem(menuItemLab[i][j]);
menu.add(jmi);
jmi.addActionListener(this);
}
}
frame.setJMenuBar(jmb);
jta.setLineWrap(true);// 自動換行
JScrollPane jsp = new JScrollPane(jta);// 滾動窗口面板
frame.add(jsp);
jb.addActionListener(this);
jbt.addActionListener(this);
jba.addActionListener(this);
frame.setLocation(200, 50);
frame.setSize(620, 660);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new MyNotepad();
}
}
⑼ java在線編譯器實現
try{
Thread.sleep(1000);
}catch(InterruptedException e){
//撲捉發生在線程中的異常,當一個正在執行的線程被中斷時就會出現這個異常,添加catch後當程序被雙擊停止時不會出現錯誤
e.printStackTrace();
}
lbClock.setText(getDate());
}
⑽ 用java做一個java的編譯器
Javac編譯器讀取Java源代碼,並將其編譯成位元組代碼,說的直白一點就是把java語言翻譯成計算機可以識別的二進制代碼。
java的編譯器有很多種,有sun公司的jdk,有oracle的jdk,還有其他一些公司的,多採用sun公司的jdk。
java同時需要集成開發環境,它集成了java的編譯器,讓我們不必通過命令行來編譯java類文件,通過它我們可以快速的開發我們需要的程序。目前用的比較多的集成開發環境有eclipse和myeclipse,eclipse有很多具有針對性的版本來應對不同的開發,而myeclipse則是相對來說功能比較全面,當然也需要購買,個人建議myeclipse。