東坡下載:內(nèi)容最豐富最安全的下載站!

首頁編程開發(fā)Java → 通過JNI實(shí)現(xiàn)Java和C++的相互調(diào)用

通過JNI實(shí)現(xiàn)Java和C++的相互調(diào)用

相關(guān)文章發(fā)表評論 來源:本站時(shí)間:2010/10/14 11:43:29字體大小:A-A+

更多

作者:東坡下載點(diǎn)擊:1514次評論:0次標(biāo)簽:

一、從Java調(diào)用C++的DLL

  1. 創(chuàng)建Java文件

  創(chuàng)建名為TestNative的Java文件,注意包名。

  package org.druze.test;

  publicclass TestNative {

  publicnativevoid sayHello();

  publicvoid sayHello2(){

  System.out.println("Say Hello From Java");

  }

  }

  如代碼所示,對于sayHello方法聲明為native,這一部分將由C++的動(dòng)態(tài)庫來實(shí)現(xiàn)。

  2. 生成class文件

  使用javac org/druze/test/TestNative.java生成class文件

  注意:執(zhí)行該命令在org所在目錄執(zhí)行。

  3. 使用javah命令生成相應(yīng)的C++頭文件

  使用javah org.druze.test.TestNative生成名為

  org_druze_test_TestNative.h的頭文件

  注意:執(zhí)行該命令在org所在目錄執(zhí)行。

  該頭文件的內(nèi)容如下:

  /* DO NOT EDIT THIS FILE - it is machine generated */

  #include

  /* Header for class org_druze_test_TestNative */

  #ifndef _Included_org_druze_test_TestNative

  #define _Included_org_druze_test_TestNative

  #ifdef __cplusplus

  extern "C" {

  #endif

  /*

  * Class: org_druze_test_TestNative

  * Method: sayHello

  * Signature: ()V

  */

  JNIEXPORT void JNICALL Java_org_druze_test_TestNative_sayHello

  (JNIEnv *, jobject);

  #ifdef __cplusplus

  }

  #endif

  #endif

  4. 創(chuàng)建C++解決方案

  此處以VS2008為例。

  新建一個(gè)VC++的Win32項(xiàng)目,選擇如圖所示的控制臺(tái)應(yīng)用程序。項(xiàng)目名稱為NativeCode。

  點(diǎn)擊確定后,再點(diǎn)擊下一步,出現(xiàn)該頁面,應(yīng)用程序類型選擇DLL,附加選項(xiàng)選擇DLL

  5. 創(chuàng)建號工程之后,將org_druze_test_TestNative.h導(dǎo)入到工程里面,并創(chuàng)建名為source.cpp的源代碼,內(nèi)容如下:

  #include"org_druze_test_TestNative.h"

  #include

  using namespace std;

  JNIEXPORT void JNICALL Java_org_druze_test_TestNative_sayHello(JNIEnv *env, jobject obj)

  {

  cout<<"Hello World!"<

  }

  6. 在工具->選項(xiàng)->項(xiàng)目和解決方案->VC++目錄菜單中,平臺(tái)選擇Win32,選擇"顯示以下內(nèi)容的目錄"為"包含文件",導(dǎo)入jni.h和jni_md.h的路徑。

  7. 編譯,生成NativeCode.dll,并將其copy到環(huán)境變量PATH的路徑下。

  8. 修改TestNative.java

  package org.druze.test;

  publicclass TestNative {

  publicnativevoid sayHello();

  publicstaticvoid main(String[] args) {

  // 加載動(dòng)態(tài)連接庫DLL,如果沒有找到的話,則會(huì)在運(yùn)行時(shí)報(bào)錯(cuò)

  System.loadLibrary("NativeCode");

  TestNative tnt = new TestNative();

  tnt.sayHello();

  }

  publicvoid sayHello2(){

  System.out.println("Say Hello From Java");

  }

  }

  運(yùn)行,顯示"Hello World!"

  9. 注意頭文件jni.h和jni_md.h可以直接導(dǎo)入到工程中也可以。

  10.注意NativeCode.dll必須放置在java命令能訪問的路徑中。

  二、從C++調(diào)用Java

  1.創(chuàng)建TestNative2.Java

  package org.druze.test;

  publicclass TestNative2 {

  publicstaticvoid testPrint(){

  System.out.println("this is from static method");

  }

  publicstaticint testReturn(){

  return 22;

  }

  publicstaticint testInput(int number){

  return 22+number;

  }

  publicint testInstance(int number){

  System.out.println("this is from instance method");

  return 11+number;

  }

  2.在VS2008中創(chuàng)建win32控制臺(tái)的應(yīng)用程序,命名為NativeCode2,在向?qū)е羞x擇空項(xiàng)目。

  3. 在工具->選項(xiàng)->項(xiàng)目和解決方案->VC++目錄菜單中,平臺(tái)選擇Win32,選擇"顯示以下內(nèi)容的目錄"為"包含文件",導(dǎo)入jni.h和jni_md.h的路徑。或直接把jni.h和jni_md.h導(dǎo)入到工程中。

  4. 在工具->選項(xiàng)->項(xiàng)目和解決方案->VC++目錄菜單中,平臺(tái)選擇Win32,選擇"顯示以下內(nèi)容的目錄"為"包含文件",導(dǎo)入jvm.lib的路徑,并在項(xiàng)目->NativeCode2屬性->配置屬性->鏈接器->命令行中添加jvm.lib(這一步或者使用#pragma comment(lib,"jvm.lib")來代替);蛘邔⒅苯訉vm.lib添加到工程中。

  5.創(chuàng)建Test.cpp

  #include

  #include

  using namespace std;

  int main()

  {

  JavaVMOption options[1];

  JNIEnv * env;

  JavaVM * jvm;

  JavaVMInitArgs vm_args;

  options[0].optionString = "-Djava.class.path=.";

  vm_args.version = JNI_VERSION_1_6;

  vm_args.nOptions = 1;

  vm_args.options = options;

  vm_args.ignoreUnrecognized = JNI_TRUE;

  long status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

  if (status == JNI_ERR)

  {

  cout<<"Can not create JVM"<

  return -1;

  }

  printf("Created JVM"n");

  jclass cls = env->FindClass("org/druze/test/TestNative2");

  printf("getCls"n");

  cout<

  if (cls !=0)

  {

  jmethodID mid = env->GetStaticMethodID(cls, "testReturn", "()I");

  printf("getMid"n");

  if (mid !=0)

  {

  printf("testReturn"n");

  int result=env->CallStaticIntMethod(cls, mid);

  printf("call over result=%d"n",result);

  }

  mid = env->GetStaticMethodID(cls, "testPrint", "()V");

  if (mid !=0)

  {

  printf("testPrint"n");

  env->CallStaticVoidMethod(cls, mid);

  }

  mid = env->GetStaticMethodID(cls, "testInput", "(I)I");

  if (mid !=0)

  {

  printf("testInput"n");

  int result=env->CallStaticIntMethod(cls, mid,22);

  printf("call over result=%d"n",result);

  }

  mid = env->GetMethodID(cls,"","()V");

  if (mid != 0)//獲取方法成功

  {

  printf("ctro!=0"n");

  jobject obj=env->NewObject(cls, mid);

  printf("new object"n");

  mid = env->GetMethodID(cls, "testInstance","(I)I");

  if (mid!=0)//獲取方法成功

  {

  printf("methodID!=0"n");

  jint result=env->CallIntMethod( obj, mid,22);

  cout<

  }

  }

  }

  jvm->DestroyJavaVM();

  system("Pause");

  return 0;

  }

  6.將jvm.dll目錄添加到PATH環(huán)境變量中,將org/druze/test/TestNative2復(fù)制到debug目錄下執(zhí)行。

  7.頭文件和庫文件的配置VC6和VC2008類似,菜單名稱有所改變。

  VC6中,配置頭文件和庫文件的目錄在,工具(Tools)->選項(xiàng)(Options)->目錄(Directories)里面的頭文件"Include files"和庫文件"Library files".添加相應(yīng)的目錄

  工程(Project)->設(shè)置(Setting)->鏈接(Link)->object/module library后面添加jvm.lib

  CodeBlocks在Project->Build options->Linker setting and Search directories中配置相應(yīng)路徑。

  8.按如下結(jié)構(gòu)組織可不用配置jvm.dll到環(huán)境變量中

  創(chuàng)建存放目錄Run(下面的文件目錄在JDK安裝目錄中都能找倒):

  Run(手工建立目錄)

  ----bin(手工建立目錄)

  ----classic(手工建立目錄)

  ----jvm.dll(文件,JDK安裝目錄中有)

  ----自己的JAR包,如果是class文件把包目錄和文件一起拷貝過來

  如果是jar文件,需要在options[1].optionString = "-Djava.class.path=.;./swt.jar";中設(shè)置

  ----JniC.exe,C調(diào)用JAVA的程序

  ----hpi.dll(文件,JDK安裝目錄中有)

  ----ioser12.dll(文件,JDK安裝目錄中有)

  ----java.dll(文件,JDK安裝目錄中有)

  ----net.dll(文件,JDK安裝目錄中有)

  ----verify.dll(文件,JDK安裝目錄中有)

  ----zip.dll(文件,JDK安裝目錄中有)

  ----lib(手工建立目錄)

  ----zi(目錄,JDK安裝目錄中有,全部拷貝過來)

  ----rt.jar(文件,JDK安裝目錄中有)

  ----tzmappings(文件,JDK安裝目錄中有)

相關(guān)評論

閱讀本文后您有什么感想? 已有 人給出評價(jià)!

  • 2791 喜歡喜歡
  • 2101 頂
  • 800 難過難過
  • 1219 囧
  • 4049 圍觀圍觀
  • 5602 無聊無聊
熱門評論
最新評論
發(fā)表評論 查看所有評論(0)
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)