當前位置:首頁 » 編程語言 » java怎麼調用c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

java怎麼調用c語言

發布時間: 2023-02-09 17:00:06

① 如何用java調用c語言寫的函數

我知道的有兩種方法,一種是直接用JNI,另一種是則是用Jacob(實質上也用的是JNI)
先講講第一種方法
1.編寫Java程序TestDll,注意,這個類有兩個作用,一個是用來做頭文件,另外一個作用就是通過它來調用dll
public class TestDll {
static
{
System.loadLibrary("DLLSample");//載入dll
}
public native static int DoubleValue(int i);//函數聲明
}
2.編譯: javac TestDll
3.生成頭文件: javah TestDll
生成TestDll.h文件,這裡面只對函數DoubleValue作了聲明
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestDll */
#ifndef _Included_TestDll
#define _Included_TestDll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: TestDll
* Method: DoubleValue
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_TestDll_DoubleValue
(JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif

4.用VC製作DLL
修改DLLSample工程,程序中添加函數DoubleValue的實現,函數名必須用jni規定格式,可以照到.h文件里的聲
明來寫:
#include "jni_md.h"
#include "TestDll.h"
JNIEXPORT jint JNICALL Java_TestDll_DoubleValue (JNIEnv *, jclass, jint p)
{
int j = p*2;
return j;

JNIEXPORT,JNICALL,JNIEnv *, jclass請都不要動,jint對應是java里的int
別忘了把TestDll.h,jni.h(這個文件在JDK/include下),jni_md.h(這個文件在jdk/include/win32下)復制到VC
工程目錄中,然後編譯生成dll
5.把生成的DLLSample.dll復制到jdk/bin下(確保PATH指向了這個目錄)
6.應用
我看到他們舉的例子都是把調用寫在了main里, 在這里我把應用取出來放在一個Servlet類中的測試的,同樣可
以得到正確結果,這里體現國TestDll的第二個作用,它是調用dll的一個紐帶
......
TestDll td = new TestDll();
System.out.println("result= " td.DoubleValue(25));
.....

注意:
如果更改了TestDll的內容或重使命名了這個文件,必須重新用它生成頭文件,在dll里也要做相應修改,
因為必須要和java裡面的聲明一致才行

----------------------------------------
本文隨寫,若有什麼錯誤,請多多指出,謝謝

說明:本文是west263的博文,作者並沒有留名

② java怎麼引用c

Java調用C語言程序時,主要是涉及到操作系統底層的事件。這種時間Java無法處理,例如用戶上傳一個視頻文件,需要後台給視頻加上水印,或者後台分離視頻流和音頻流。只能通過調用C語言處理。
使用Java如何去調用C語言的介面呢?使用Java的JNI技術。
具體調用步驟如下:
1.首先創建Java文件 HelloJni.java ,並創建native方法。
2.編譯Java文件並生成java頭文件。
3.創建C語言文件,HelloWorld.c。
4.生成動態鏈接庫文件 libhello.so。
5.設置動態鏈接庫文件的目錄。
6.把剛才生成的so文件拷貝到/home/lib下,然後執行class文件。

③ Java如何調用C語言代碼

Java Native Interface(JNI)是Java語言的本地編程介面,是J2SDK的一部分。在java程序中,我們可以通過JNI實現一些用java語言不便實現的功能。通常有以下幾種情況我們需要使用JNI來實現。 標準的java類庫沒有提供你的應用程序所需要的功能,通常這些功能是平台相關的 你希望使用一些已經有的類庫或者應用程序,而他們並非用java語言編寫的 程序的某些部分對速度要求比較苛刻,你選擇用匯編或者c語言來實現並在java語言中調用他們 下面我們開始編寫HelloWorld程序,由於涉及到要編寫c/c++代碼因此我們會在開發中使用Microsoft VC++工具。編寫java代碼,我們在硬碟上建立一個hello目錄作為我們的工作目錄,首先我們需要編寫自己的java代碼,在java代碼中我們會聲明native方法,代碼非常簡單。如下所示 class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().displayHelloWorld(); } } 注意我們的displayHelloWorld()方法的聲明,它有一個關鍵字native,表明這個方法使用java以外的語言實現。方法不包括實現,因為我們要用c/c++語言實現它。注意System.loadLibrary("hello")這句代碼,它是在靜態初始化塊中定義的,系統用來裝載hello共享庫,這就是我們在後面生成的hello.dll(如果在其他的操作系統可能是其他的形式,比如hello.so) 編譯java代碼 javac HelloWorld.java 生成HelloWorld.class文件 創建.h文件 這一步中我們要使用javah命令生成.h文件,這個文件要在後面的c/c++代碼中用到,我們運行 javah HelloWorld。這樣我們可以看到在相同目錄下生成了一個HelloWorld.h文件,文件內容如下 在此我們不對他進行太多的解釋。 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld #ifdef __cplusplus extern "C" { #endif /* * Class: HelloWorld * Method: displayHelloWorld * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif 編寫本地實現代碼 在這部分我們要用C/C++語言實現java中定義的方法,我們在VC++中新建一個Project,然後創建一個HelloWorldImp.cpp文件,內容如下 #include <jni.h> #include "HelloWorld.h" #include <stdio.h> JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) { printf("Hello world!\n"); return; } 注意我們這里include了 jni.h和剛才得到的HelloWorld.h文件。因此你要在VC++裡面設置好,jni.h在JAVA_HOME/include裡面。編譯通過後再生成hello.dll文件。 運行java程序 把上面生成的hello.dll文件復制到我們的工作目錄,這時候我們的目錄中包括HelloWorld.java,HelloWorld.class和hello.dll文件。運行java HelloWorld命令,則可在控制台看到Hello world| 的輸出了。運行VC++; 文件---新建---選「win32 console application」(控制台程序)---在右方設置好路徑並輸入工程名---確定 接下來的幾個提示框點確定就行了,那是提示是否要用VC++提供的框架之類的 在左邊的工作空間中選「FILEVIEW」標簽項,點開「+」號,右鍵點擊「SOURCE FILES」,選「添加文件到目錄」,此即添加你要建立的C++源程序文件,會提示你沒有文件,是否添加,你點是,輸入文件名保存就OK了 然後SOURCE FILES下就出現了你剛才建立的*.CPP文件,雙擊,輸入代碼. 以下就是點」組建」菜單中的」編譯」、」組建」等命令進行調試了。 相信你會了。 http://hi..com/%C7%E9%D4%B5and%D3%D1%D2%EA/blog/item/34084645e8560f23cefca3b7.html

④ java如何調用C語言程序

用 Runtime 的 exec 方法的確是可行的。

假設我們已經把以下的 C 程序編繹成 adder.exe:

#include <stdio.h>

int main() { /* 簡單地循環列印標准輸入上的兩個整數之和 */
int a, b, lineNumber = 0;
while (scanf("%d %d", &a, &b))
printf("Line# %d \t %d + %d == %d\n", ++lineNumber, a, b, a + b);

return 0;
}

以下的 Java 程序可以在啟動 adder.exe 後,跟 adder.exe 的標准輸入和輸出接軌,然後持續不斷地向它發送數據和索取結果:

import java.io.*;

class C {
public static void main(String[] args) throws Exception {

final Process proc = Runtime.getRuntime().exec("adder.exe");

// 用另一個線程把參數送到 proc 的標准輸入上去。
new Thread() {
public void run() {
OutputStream stdin = proc.getOutputStream();
for (int i = 0; ; i++) {
try {
Thread.sleep(1); // 要休息片刻才看得到 I/O 的緩存效果。
stdin.write((i + " " + i + "\n").getBytes());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}.start();

// 主線程負責讀取並列印 proc 的標准輸出。
BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
for (String line; null != (line = stdout.readLine()); )
System.out.println(line);
}
}

循環里的 Thread.sleep(1) 純粹是為了凸顯 I/O 的緩存效果。
我測試時看到大約 900 行的緩存量(用 32-bit XP 和 Java 1.6)。

⑤ 怎樣能在Java中調用C語言生成的DLL文件

以下這個例子實現的是通過調用C寫的DLL,計算字元串長度。 一、 生成C的頭文件 1. 編輯Main.java public class Main { public native static int getStrNum(byte str[], int strLen); }2. 生成頭文件 按win + r打開「運行」窗口,輸入「cmd」,打開DOS控制台窗口。進入上面Main.java所在的目錄中,輸入: javac Main.java javah Main 兩條命令完成後會生成Main.h文件 二、 生成DLL 1. 新建空工程 在VS中新建工程:Win32 Console Application,取名「MakeDLL」,選擇空工程。新建後修改工程屬性: (1) General中,將「Configuration Type」改為「Dynamic Library (.dll)」; (2) C/C++的General中,將「Additional Include Directories」添加兩項: 「C:Program FilesJavajdk1.5.0_06include」 「C:Program FilesJavajdk1.5.0_06includewin32」 根據你安裝的JAVA路徑而設置,這是因為在C/C++編譯過程中要使用JAVA的jni.h等文件 2. 將上面生成的Main.h添加入工程 3. 新建一個新的文件main.cpp,代碼如下: #include 'Main.h' #include 'string.h' JNIEXPORT jint JNICALL Java_Main_getStrNum (JNIEnv *env, jclass cls, jbyteArray str, jint strLen) { jbyte *buffer = (*env).GetByteArrayElements(str, 0); buffer[strLen] = ''; // 由於JAVA自動分配空間,需要傳進來字元串長度參數 jint len = strlen((char*)buffer); return len; }4. 按F7編譯鏈接,生成MakeDLL.dll文件 三、 JAVA調用DLL 在JAVA中使用上面生成的DLL文件: 1. 將MakeDLL.dll復制到與使用DLL的JAVA文件相同的目錄下。 2. JAVA文件的源代碼: public class Main { static { System.loadLibrary('MakeDLL'); } public native static int getStrNum(byte str[], int strLen); public static void main(String[] args) { Main instance = new Main(); String str = new String('haha'); int num = instance.getStrNum(str.getBytes(), str.length()); System.out.println(num); } }總結: 另外,JAVA與DLL函數的參數傳遞過程,像int類型的,可以直接從JNI函數參數列表中獲取;而數組元素則要通過JNIEnv來獲取: jbyte *buffer = (*env).GetByteArrayElements(str, 0); // str是參數列表中jbyteArray變數 同理可以獲取char[]的元素。 函數返回時,可以直接用return語句返回。也可以設置參數列表中的變數指針來返回: (*env).SetByteArrayRegion(byteArray, 0, 128, byteArr); byteArray是參數列表中的jbyteArray變數,作為指針用來返回需要返回的信息;byteArr是jbyte*類型,裡面存放的值是要返回的內容。 其它的信息可以從Google或Bai中通過查找「jni」或「java調用DLL」來查閱到。 (T007)