當前位置:首頁 » 編程語言 » java調用c程序

java調用c程序

發布時間: 2023-05-10 15:37:48

1. 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文件。

2. java調用c++庫的時候有結構體怎麼辦

Java調用C庫的時候,可以使用JNA或者JNI來調用C庫中的結構體。JNA可以通過映射啟晌一個Java內部類來實現對應C庫中結悄隱鋒構體的攜亮映射,而JNI則需要在Java代碼中定義一個數據結構,它將會與C庫中的結構體保持一致。

3. java 調用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』);//載入資源文件MakeDLL.dll
}
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);
}
}

4. Linux環境下java調用C

你的JNI 寫錯了吧

java里的 char和 C的char完全不是一回事

java里你要寫 stringjava_encryptpswd(string Password, string EncryptedKey );

生成的 C頭文件,應該是 jstring java_encryptpswd(JEnvi* pEnvi,jstring Password,jstring EncryptedKey)

我手寫的,沒查資料,大概是這樣。。

然後第一個參數是當前虛擬機事例,裡面有很多可用的函數

後面兩個是java里字元串結構,在C裡面的表示法, 其實它就是指針而已。

然後你可以用pEnvi里的函數,將java的string,轉化成 c的string。

然後調用 C的頭文件的函數,得到結果,在組裝成java的字元串。

比如例子:

我要用C來實現 java的字元串定位。

No.1 定義java的本地介面
public native String NAConvert(String arg1,String arg2);

No.2 生成頭文件
JNIEXPORT jstring JNICALL Java_com_test_mainandroid_MainAndroidNative_NAConvert
(JNIEnv *, jobject, jstring, jstring);

No.3 自己創建一個實現文件,實現上面函數
jstring Java_com_test_mainandroid_MainAndroidNative_NAConvert
(JNIEnv* env, jobject obj, jstring arg1, jstring arg2)
{
jsize len = env->GetStringLength(arg1);
jchar* pBuf = new jchar[len+1];
env->GetStringRegion(arg1,0,len,pBuf);

jclass m = env->FindClass("java/lang/String");

jmethodID mid = env->GetMethodID(m,"charAt","(I)C");

jchar c = env->CallCharMethod(arg1,mid,1);

return arg1 ;
}

第一個是虛擬機事例指針,第二個參數是介面方法所在對象的 this。
第三個及以後才是你的介面的參數。
java里傳入的所有對象參數,在C裡面都是句柄。必須要用第一個參數env才能解析其中含義。

5. java如何調用javac命令

配置環境變數後才可以
我的電腦點右鍵,選擇「屬性」,選擇「高級」標簽,進入環境變數設置,分別設置如下三個環境變數:
設置JAVA_HOME:
一是為了方便引用,比如,JDK安裝在C:\jdk1.6.0目錄里,則設置JAVA_HOME為該目錄路徑, 那麼以後要使用這個路徑的時候, 只需輸入%JAVA_HOME%即可, 避免每次引用都輸入很長的路徑串;
二則是歸一原則, 當JDK路徑改變的時候, 僅需更改JAVA_HOME的變數值即可, 否則,就要更改任何用絕對路徑引用JDK目錄的文檔, 要是萬一沒有改全, 某個程序找不到JDK, 後果是可想而知的----系統崩潰!
三則是第三方軟體會引用約定好的JAVA_HOME變數, 不然, 你不能正常使用該軟體.
在系統環境變數那一欄中點->新建JAVA_HOME (JAVA_HOME指向的是JDK的安裝路徑)
變數名: JAVA_HOME
變數值: C:\jdk1.6.0
(1)設置好path變數,使得我們能夠在系統中的任何地方運行java應用程序,比如javac、java、javah等等,這就要找到我們安裝JDK的目錄,
假設我們的JDK安裝在C:\jdk1.6.0目錄下,那麼在C: \jdk1.6.0\bin目錄下就是我們常用的java應用程序,我們就需要把C:\jdk1.6.0\bin這個目錄加到path環境變數裡面。
在系統變數里找到path變數,選擇->編輯;(裡面已經有很多的變數值,是在變數值的最前面加上C:\jdk1.6.0\bin; 如果沒有 就新建一個 但是 一般都會有的)
變數名: path
變數值: C:\jdk1.6.0\bin;
或 %JAVA_HOME%\bin;
(2)classpath環境變數,是當我們在開發java程序時需要引用別人寫好的類時,要讓java解釋器知道到哪裡去找這個類。通常,sun為我們提供了一些額外的豐富的類包,一個是dt.jar,一個是tools.jar,這兩個jar包都位於C:\jdk1.6.0\lib目錄下,所以通常我們都會把這兩個jar包加到我們的classpath環境變數中set classpath=.;C:\jdk1.6.0\lib\tools.jar;C:\jdk1.6.0\lib\dt.jar。
在系統環境變數那一欄中點->新建classpath
變數名: classpath
變數值: .;C:\jdk1.6.0\lib\tools.jar;C:\jdk1.6.0\lib\dt.jar;
或 .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;
(注意,CLASSPATH 中最前面是有個 「.」的,表示當前目錄,這樣當我們運行java AClass的時候,系統就會先在當前目錄尋找AClass文件了。)

6. java如何調用c語言源文件並進行執行.

Think in java 這本書的附錄有這么一章 使用非JAVA代碼

附錄A 使用非JAVA代碼

JAVA語言及其標准API(應用程序編程介面)應付應用程序的編寫已綽綽有餘。但在某些情況下,還是必須使用非JAVA編碼。例如,我們有時要訪問操作系統的專用特性,與特殊的硬體設備打交道,重復使用現有的非Java介面,或者要使用「對時間敏感」的代碼段,等等。與非Java代碼的溝通要求獲得編譯器和「虛擬機」的專門支持,並需附加的工具將Java代碼映射成非Java代碼(也有一個簡單方法:在第15章的「一個Web應用」小節中,有個例子解釋了如何利用標准輸入輸出同非Java代碼連接)。目前,不同的開發商為我們提供了不同的方案:Java 1.1有「Java固有介面」(Java Native Interface,JNI),網景提出了自己的「Java運行期介面」(Java Runtime Interface)計劃,而微軟提供了J/Direct、「本源介面」(Raw Native Interface,RNI)以及Java/COM集成方案。
各開發商在這個問題上所持的不同態度對程序員是非常不利的。若Java應用必須調用固有方法,則程序員或許要實現固有方法的不同版本——具體由應用程序運行的平台決定。程序員也許實際需要不同版本的Java代碼,以及不同的Java虛擬機。
另一個方案是CORBA(通用對象請求代理結構),這是由OMG(對象管理組,一家非贏利性的公司協會)開發的一種集成技術。CORBA並非任何語言的一部分,只是實現通用通信匯流排及服務的一種規范。利用它可在由不同語言實現的對象之間實現「相互操作」的能力。這種通信匯流排的名字叫作ORB(對象請求代理),是由其他開發商實現的一種產品,但並不屬於Java語言規范的一部分。
本附錄將對JNI,J/DIRECT,RNI,JAVA/COM集成和CORBA進行概述。但不會作更深層次的探討,甚至有時還假定讀者已對相關的概念和技術有了一定程度的認識。但到最後,大家應該能夠自行比較不同的方法,並根據自己要解決的問題挑選出最恰當的一種。

A.1 Java固有介面
JNI是一種包容極廣的編程介面,允許我們從Java應用程序里調用固有方法。它是在Java 1.1里新增的,維持著與Java 1.0的相應特性——「固有方法介面」(NMI)——某種程度的兼容。NMI設計上一些特點使其未獲所有虛擬機的支持。考慮到這個原因,Java語言將來的版本可能不再提供對NMI的支持,這兒也不準備討論它。
目前,JNI只能與用C或C++寫成的固有方法打交道。利用JNI,我們的固有方法可以:
■創建、檢查及更新Java對象(包括數組和字串)
■調用Java方法
■俘獲和丟棄「異常」
■裝載類並獲取類信息
■進行運行期類型檢查
所以,原來在Java中能對類及對象做的幾乎所有事情在固有方法中同樣可以做到。

A.1.1 調用固有方法
我們先從一個簡單的例子開始:一個Java程序調用固有方法,後者再調用Win32的API函數MessageBox(),顯示出一個圖形化的文本框。這個例子稍後也會與J/Direct一志使用。若您的平台不是Win32,只需將包含了下述內容的C頭:
#include <windows.h>
替換成:
#include <stdio.h>
並將對MessageBox()的調用換成調用printf()即可。
第一步是寫出對固有方法及它的自變數進行聲明的Java代碼:

class ShowMsgBox {
public static void main(String [] args) {
ShowMsgBox app = new ShowMsgBox();
app.ShowMessage("Generated with JNI");
}
private native void ShowMessage(String msg);
static {
System.loadLibrary("MsgImpl");
}
}

在固有方法聲明的後面,跟隨有一個static代碼塊,它會調用System.loadLibrary()(可在任何時候調用它,但這樣做更恰當)System.loadLibrary()將一個DLL載入內存,並建立同它的鏈接。DLL必須位於您的系統路徑,或者在包含了Java類文件的目錄中。根據具體的平台,JVM會自動添加適當的文件擴展名。

熱點內容
ftp命令使用 發布:2025-07-18 18:13:05 瀏覽:44
辦稅密碼是什麼 發布:2025-07-18 18:12:32 瀏覽:487
linuxftp文件下載 發布:2025-07-18 18:12:30 瀏覽:941
互聯網網站伺服器搭建 發布:2025-07-18 18:01:06 瀏覽:478
安卓手機怎麼辮真偽 發布:2025-07-18 17:13:14 瀏覽:186
java後台json 發布:2025-07-18 17:12:21 瀏覽:680
手機游戲配置主要看哪些 發布:2025-07-18 17:00:47 瀏覽:148
微課源碼 發布:2025-07-18 16:34:44 瀏覽:1001
壓縮長抱枕 發布:2025-07-18 16:13:38 瀏覽:505
如何使用wifi熱點配置網路 發布:2025-07-18 16:06:25 瀏覽:970