vs2008 c++ 调用java
參考:http://zhuyx808.iteye.com/blog/460152
計(jì)劃第三篇寫一個(gè)java安裝程序?qū)嵗?#xff08;客戶端無(wú)jre環(huán)境的安裝包),以解決java程序(軟件)安裝不方便的問(wèn)題,使java程序安裝也傻瓜化。?
直接進(jìn)入正題:?
完成本實(shí)例需要下列工具/環(huán)境:?
1、java環(huán)境?
2、c/cpp編輯器。windows下推薦用vs/vc++,我用的是vs2008。linux下gcc/g++?
從 C/CPP 程序調(diào)用 Java 代碼需要四個(gè)步驟 :?
一 編寫 Java 代碼。?
二 編譯 Java 代碼。?
三 編寫 C/C++ 代碼。?
四 運(yùn)行本機(jī) C/C++ 應(yīng)用程序。?
1、編寫java代碼?
為了達(dá)到示范作用,java方法我用兩個(gè),一個(gè)是靜態(tài)方法,一個(gè)是普通方法。?
C2java.java?
靜態(tài)方法的好處是我不用實(shí)例化,直接可以調(diào)用方法。調(diào)用起來(lái)比較簡(jiǎn)單,不容易出錯(cuò)。?
2、編譯java代碼?
javac 命令。(略)?
3、編寫 C/C++ 代碼?
我想在c/cpp中直接生成一個(gè)exe然后窗口輸出結(jié)果,所以我就建立一個(gè)exe工程。編輯器jni環(huán)境是上篇已經(jīng)搭建好的,所以這里只需要少量配置就可以了。好了,我們先建立一個(gè)工程:?
打開vs2008,新建一 win32 console App 工程?
?
鍵入工程名字c2java,點(diǎn)擊OK,出來(lái)窗口點(diǎn)擊next,選取console app?
?
點(diǎn)擊完成。到這里先不忙編碼實(shí)現(xiàn),我們先把環(huán)境搭建好,右鍵工程屬性,選取 linker -->input,在右邊窗口添加依賴jvm.lib,這個(gè)lib的位置在你%JAVA_HOME%/lib 下。如果你的路徑中同我一樣包含空格(例如Program Files)記得用引號(hào)括起來(lái)。?
打開stdafx.h文件添加?
C++代碼??
打開c2java.cpp,鍵入下面的代碼?
C++代碼??
下面解釋下上面的代碼:?
JavaVMOption options[] 具有用于 JVM 的各種選項(xiàng)設(shè)置。聲明的 JavaVMOption options[] 數(shù)組足夠大,就能容納我們希望使用的所有選項(xiàng)。在本實(shí)例中,我們使用的選項(xiàng)就是類路徑選項(xiàng)。?
JNIEnv *env 表示 JNI 執(zhí)行環(huán)境。?
JavaVM *jvm 是指向 JVM 的指針。我們主要使用這個(gè)指針來(lái)創(chuàng)建、初始化和銷毀 JVM。JavaVMInitArgs vm_args 表示可以用來(lái)初始化 JVM 的各種 JVM 參數(shù)。?
設(shè)置參數(shù)后,創(chuàng)建我們的jvm :?
? status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);?
成功返回0,不成功返回JNI_ERR。?
創(chuàng)建完成后,我們就可以查找我們的class了,因?yàn)槲覀兊膉ava類一般都有包,所以我們也要加上包路徑com/testJni/testDemo/C2java?
在這里我們會(huì)使用到j(luò)ava的一個(gè)命令javap ,這個(gè)命令有什么用那,我們用javap -s -p C2java看看?
?
打開jni.h我們會(huì)發(fā)現(xiàn),Signature就是sig,也就是GetStaticMethodID( cls, "add", "(II)I")方法的第三個(gè)參數(shù)。GetStaticMethodID表示調(diào)用static方法,GetMethodID調(diào)用普通方法。下面就是傳入?yún)?shù),打出結(jié)果。?
在看jni.h的時(shí)候我們注意到有 CallStaticXXXMethod() 和 CallXXXMethod() 之類的方法。這些方法分別代表調(diào)用靜態(tài)方法和成員方法,用方法的返回類型(例如,Object、Boolean、Byte、Char、Int、Long 等等)代替變量 XXX。?
靜態(tài)方法和普通方法不同之處就是普通方法必須要先實(shí)例化一個(gè)java對(duì)象,調(diào)用構(gòu)造器的時(shí)候方法的名稱為“<init>”。?
下面的代碼就不用我再解釋了,先是new一個(gè)實(shí)例出來(lái),然后調(diào)用實(shí)例的方法。?
最后記得銷毀jvm。?
代碼解釋完了,我們build下這個(gè)工程,生成c2java.exe。?
4、運(yùn)行exe?
因?yàn)槲覀兩傻膃xe需要調(diào)用jvm.dll初始化,為了使運(yùn)行的exe不報(bào)錯(cuò)誤,我們把%JAVA_HOME%/jre/bin/server也加進(jìn)path目錄。方便系統(tǒng)自動(dòng)搜索jvm.dll。?
運(yùn)行結(jié)果:?
?
最后補(bǔ)充:本實(shí)例并沒(méi)有涉及到j(luò)ava的異常、java c/cpp的編碼轉(zhuǎn)換問(wèn)題,對(duì)于異常問(wèn)題,C里沒(méi)有異常,請(qǐng)使用jni的異常處理函數(shù)。編碼轉(zhuǎn)換問(wèn)題上篇已有介紹,此處略去。
if ??Cannot open include file: 'jni.h': No such file or directory
if you have this problem with the jni there is one really simple way to solve it.
1.) go to your project properties
2.) navigate in the tree to "Configuration Properties->C/C++" then look at the first entry "Additional Include Directories"
3.) in there enter the path: "<JDK-Version-Path>\include";"<JDK-Version-Path>\include\win32"
以上還是有錯(cuò)誤
將jvm.dll和msvcr100.dll拷貝至程序目錄下
在程序上下添加:HINSTANCE hInstance = ::LoadLibraryA("C:\\Program Files\\Java\\jdk1.7.0_01\\jre\\bin\\server\\jvm.dll");
::FreeLibrary(hInstance);?
總結(jié)
以上是生活随笔為你收集整理的vs2008 c++ 调用java的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: windows下配置java
- 下一篇: c++调用Java以及string互转