日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

vs2008 c++ 调用java

發布時間:2024/9/30 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vs2008 c++ 调用java 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:http://zhuyx808.iteye.com/blog/460152

計劃第三篇寫一個java安裝程序實例(客戶端無jre環境的安裝包),以解決java程序(軟件)安裝不方便的問題,使java程序安裝也傻瓜化。?

直接進入正題:?

完成本實例需要下列工具/環境:?
1、java環境?
2、c/cpp編輯器。windows下推薦用vs/vc++,我用的是vs2008。linux下gcc/g++?

從 C/CPP 程序調用 Java 代碼需要四個步驟 :?
一 編寫 Java 代碼。?
二 編譯 Java 代碼。?
三 編寫 C/C++ 代碼。?
四 運行本機 C/C++ 應用程序。?

1、編寫java代碼?

為了達到示范作用,java方法我用兩個,一個是靜態方法,一個是普通方法。?

C2java.java?

Java代碼??
  • package?com.testJni.testDemo;??
  • ??
  • public?class?C2java?{??
  • ????public?C2java(){??
  • ????????super();??
  • ????}??
  • ????public?static?int?add(int?a,int?b)?{??
  • ????????return?a+b;??
  • ????}??
  • ????public?boolean?judge(boolean?bool)?{??
  • ????????return?!bool;??
  • ????}??
  • ??
  • }??

  • 靜態方法的好處是我不用實例化,直接可以調用方法。調用起來比較簡單,不容易出錯。?

    2、編譯java代碼?

    javac 命令。(略)?

    3、編寫 C/C++ 代碼?

    我想在c/cpp中直接生成一個exe然后窗口輸出結果,所以我就建立一個exe工程。編輯器jni環境是上篇已經搭建好的,所以這里只需要少量配置就可以了。好了,我們先建立一個工程:?

    打開vs2008,新建一 win32 console App 工程?
    ?
    鍵入工程名字c2java,點擊OK,出來窗口點擊next,選取console app?
    ?
    點擊完成。到這里先不忙編碼實現,我們先把環境搭建好,右鍵工程屬性,選取 linker -->input,在右邊窗口添加依賴jvm.lib,這個lib的位置在你%JAVA_HOME%/lib 下。如果你的路徑中同我一樣包含空格(例如Program Files)記得用引號括起來。?

    打開stdafx.h文件添加?
    C++代碼??
  • #include?<iostream>??
  • #include?<jni.h>??
  • ??
  • #ifdef?_WIN32??
  • #define?PATH_SEPARATOR?';'??
  • #else??
  • #define?PATH_SEPARATOR?':'??
  • #endif??

  • 打開c2java.cpp,鍵入下面的代碼?
    C++代碼??
  • using?namespace?std;??
  • ??
  • int?main()??
  • {??
  • ??????
  • ??JavaVMOption?options[1];??
  • ??JNIEnv?*env;??
  • ??JavaVM?*jvm;??
  • ??JavaVMInitArgs?vm_args;??
  • ??long?status;??
  • ??jclass?cls;??
  • ??jmethodID?mid;??
  • ??jint?square;??
  • ??jboolean?not;??
  • ????jobject?jobj;??
  • ??
  • ??options[0].optionString?=?"-Djava.class.path=.";??
  • ??vm_args.version?=?JNI_VERSION_1_2;??
  • ??vm_args.nOptions?=?1;??
  • ??vm_args.options?=?options;??
  • ??status?=?JNI_CreateJavaVM(&jvm,?(void**)&env,?&vm_args);??
  • ??if?(status?!=?JNI_ERR)??
  • ??{??
  • ????????cls?=?env->FindClass("com/testJni/testDemo/C2java");??
  • ????if(cls?!=0)??
  • ????{???
  • ????????????????mid?=?env->GetStaticMethodID(?cls,?"add",?"(II)I");??
  • ????????if(mid?!=0)??
  • ????????{????
  • ????????????????????square?=?env->CallStaticIntMethod(?cls,?mid,?5,5);??
  • ????????????????????std::cout?<<?square?<<?std::endl;??
  • ??????????}??
  • ????????????????mid?=?env->GetMethodID(cls,"<init>","()V");??
  • ????????????????if(mid?!=0)??
  • ????????{????
  • ????????????????????jobj=env->NewObject(cls,mid);??
  • ????????????????????std::cout?<<?"init?ok"?<<?std::endl;??
  • ??????????}??
  • ????????????????mid?=?env->GetMethodID(?cls,?"judge","(Z)Z");??
  • ????????????????if(mid?!=0)??
  • ????????{????
  • ????????????????????not?=?env->CallBooleanMethod(jobj,?mid,?1);??
  • ????????????????????if(!not){??
  • ????????????????????????std::cout?<<?"Boolean?ok"?<<?std::endl;??
  • ????????????????????}??
  • ????????}??
  • ??????????????????
  • ????}??
  • ??
  • ????jvm->DestroyJavaVM();??
  • ???return?0;??
  • ??}??
  • ??else??
  • ????return?-1;??
  • ??
  • }??

  • 下面解釋下上面的代碼:?
    JavaVMOption options[] 具有用于 JVM 的各種選項設置。聲明的 JavaVMOption options[] 數組足夠大,就能容納我們希望使用的所有選項。在本實例中,我們使用的選項就是類路徑選項。?
    JNIEnv *env 表示 JNI 執行環境。?
    JavaVM *jvm 是指向 JVM 的指針。我們主要使用這個指針來創建、初始化和銷毀 JVM。JavaVMInitArgs vm_args 表示可以用來初始化 JVM 的各種 JVM 參數。?
    設置參數后,創建我們的jvm :?
    ? status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);?
    成功返回0,不成功返回JNI_ERR。?
    創建完成后,我們就可以查找我們的class了,因為我們的java類一般都有包,所以我們也要加上包路徑com/testJni/testDemo/C2java?

    在這里我們會使用到java的一個命令javap ,這個命令有什么用那,我們用javap -s -p C2java看看?
    ?
    打開jni.h我們會發現,Signature就是sig,也就是GetStaticMethodID( cls, "add", "(II)I")方法的第三個參數。GetStaticMethodID表示調用static方法,GetMethodID調用普通方法。下面就是傳入參數,打出結果。?
    在看jni.h的時候我們注意到有 CallStaticXXXMethod() 和 CallXXXMethod() 之類的方法。這些方法分別代表調用靜態方法和成員方法,用方法的返回類型(例如,Object、Boolean、Byte、Char、Int、Long 等等)代替變量 XXX。?
    靜態方法和普通方法不同之處就是普通方法必須要先實例化一個java對象,調用構造器的時候方法的名稱為“<init>”。?

    下面的代碼就不用我再解釋了,先是new一個實例出來,然后調用實例的方法。?

    最后記得銷毀jvm。?

    代碼解釋完了,我們build下這個工程,生成c2java.exe。?

    4、運行exe?

    因為我們生成的exe需要調用jvm.dll初始化,為了使運行的exe不報錯誤,我們把%JAVA_HOME%/jre/bin/server也加進path目錄。方便系統自動搜索jvm.dll。?
    運行結果:?
    ?

    最后補充:本實例并沒有涉及到java的異常、java c/cpp的編碼轉換問題,對于異常問題,C里沒有異常,請使用jni的異常處理函數。編碼轉換問題上篇已有介紹,此處略去。



    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"

    以上還是有錯誤

    將jvm.dll和msvcr100.dll拷貝至程序目錄下

    在程序上下添加:HINSTANCE hInstance = ::LoadLibraryA("C:\\Program Files\\Java\\jdk1.7.0_01\\jre\\bin\\server\\jvm.dll");

    ::FreeLibrary(hInstance);?


    總結

    以上是生活随笔為你收集整理的vs2008 c++ 调用java的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。