要在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!"了
㈡ 用伺服器做在線編譯器
如果是針對傳統使用方法的編程語言實現一個的話涉及的內容很雜,包括:
Web伺服器+Web伺服器與後端程序交互的組件(這個可以用現成的,我用的是nginx+FCGI)
後端程序
後端核心就是一個類似調用系統給的類似execl的API執行一下對應編譯工具,用這個API時還得精心處理一下管道,把輸出內容導出來顯示回網頁。
但是因為這類程序和OJ一樣,是網路上的公共服務而且居然還允許用戶上傳代碼編譯執行,所以問題主要集中在安全處理上,而且安全問題的處理高度依賴操作系統。
以Linux為例,安全方麵包括但不僅包括以下內容:
依賴環境構建、沙盒
運行身份,包括GID、UID
資源限制,包括socket、文件操作、核心轉儲大小、文件數、子進程數等等
syscall限制
執行時間限制,包括運行時間和CPU時間
文件系統壓力
Windows下是另一堆問題要解決,比Linux復雜得多(也許是我不太會用Windows)。
我認識一人,自己實現了一個類似Haskell的東西,有和Go Playground差不多的在線運行網頁,我問他怎麼那麼快把那麼多東西都搞完了,他說,「整個語言就是用JS實現的,所以有瀏覽器就能運行,不需要後端」,這也是一種思路。
天互數據
㈢ 網站在線編輯是干什麼的
網站編輯工作就是添加網站內容,網站現有內容編輯,高級些的是負責某一大型網站一頻道,含網站風格編輯,網站主題炒作等等.
各種站運營方式及對人才要求不同,你可以注冊一個MJ來了解清楚.
㈣ 能實現輸入函數的C/C++在線編譯器
我認為目前最好用的在線編譯器; http://www.mcqyy.com/RunCode/cpp/
㈤ 除了leetcode還有哪些在線編譯
在線編輯器有很多。比較好的有FCK 有各個語言版本。還有個國產的webeditor。這兩個是比較好的。也最常用的。但是配置相對比較麻煩。還有一些雜牌的在線編輯器。都不是太好用。如果沒有特殊的要求。推薦你兩個好的。一個是網易的編輯器。簡單明了。常用功能都有。另一個是新浪編輯器。界面比較漂亮。功能擴展相當容易。
㈥ 能在網上在線編譯C語言,並編譯呈現出來的網站是什麼
http://acm.h.e.cn/
㈦ 在線編譯是否利用了模式識別
主要我們實驗室沒有和其他領域相結合的課題,比如醫學圖像處理、遙感圖像處理、農業信息化、生物信息學等等,只能做做理論,要是做應用只能做做通用型的應用,比如人臉識別等等,不過感覺這個好像不太容易創新了,做的人太多了。 工作很高端,比...
㈧ 有哪些好用的在線 LaTeX 編譯器
vim -- 強大的編碼功能,加亮之類的只是小意思了。如果會配置的話,還可以實現自動補齊代碼、自動編譯、自動刷新瀏覽器之類的功能。會用 vi 或 vim 的話,強烈推薦,否則就算了。操作系統:Unix/Linux, Windows, MacOS, ...
emacs -- 沒好好用過。編寫其他代碼時,它和 vim 一樣強大,相信編寫 LaTeX 文檔也一樣強。emacs 和 vi (現已被 vim 取代) 是 Unix 用戶的兩大神器,一般人只能駕馭其中一個,牛人才能兩個都精通。
WinEdt --- 集成環境,有編碼窗口,有編譯按鈕。由於 CTeX 的原因,在國內的 Windows 平台上十分流行。其實比較起來就是花哨一點而已,真正要看誰更快、功能更豐富的話,WinEdt 比 vim 和 emacs 差一大截。它的好處是上手快。vim 和 emacs 不練上幾個月是駕馭不了的(不過 vim 和 emacs 現在都有窗口版,藉助於滑鼠也容易上手,但是快捷性就犧牲了)。操作系統:Windows,收費軟體。如果安裝 CTeX 的話,它會自動給你一個免費的 WinEdt.
Kile -- 類似於 WinEdt 的集成環境。但 WinEdt 是通用的開發集成環境,Kile 是專門針對 LaTeX 的集成開發環境,所以,要比 WinEdt 更好。操作系統:Linux
Scientifc WorkPlace -- 所見即所想 (WYSIWYM) 軟體。Windows 用。收費軟體。
Lyx -- WYSIWYM 軟體,Linux, Windows, MacOS 都支持。
TeXmacs -- WYSIWYM 軟體,Linux/Unix, Windows, MacOS 都支持。舊版本對中文支持不好,新版本不知道。
Windows 系統中的記事本、寫字板也可以用,但是功能太低下。
㈨ java在線編譯器實現
try{
Thread.sleep(1000);
}catch(InterruptedException e){
//撲捉發生在線程中的異常,當一個正在執行的線程被中斷時就會出現這個異常,添加catch後當程序被雙擊停止時不會出現錯誤
e.printStackTrace();
}
lbClock.setText(getDate());
}
㈩ 在線編譯好用嗎,有什麼好處
SageMathCloud
這個是Sage(一個志在超越MATLAB、Mathematica、Maple的數學軟體)在線使用站點,同時也支持LaTeX文檔的書寫、編譯、預覽及查看,最方便的是原生提供了SageTeX的支持,繪制函數圖像更方便,數學運算在文檔內直接完成。