- 1. JAVA開發(fā)工具(集成圖形開發(fā)環(huán)境和多線程調(diào)試器) V3...
- 2. 手機(jī)人人 (for Java校內(nèi)通手機(jī)客戶端) 官方安裝版
- 3. Java反編譯工具
- 4. C/C++語言編程學(xué)習(xí)工具 2.0
- 5. 模擬器運(yùn)行需要JAVA虛擬機(jī)(手機(jī)軟件下載)
- 6. Seurat|基于Java的圖像處理工具 1.0.1
- 7. C/C++程序設(shè)計(jì)學(xué)習(xí)與實(shí)驗(yàn)系統(tǒng)|C/C++程序設(shè)計(jì)學(xué)習(xí)與...
- 8. Microsoft Visual C++ 6.0 簡(jiǎn)體中文企業(yè)版
- 9. Sun Java SE Runtime Environment (JRE) for 6 Upda
- 10. Javascript混淆加密器1.2破解版
通過JNI實(shí)現(xiàn)Java和C++的相互調(dià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");
}
}
如代碼所示,對(duì)于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)建號(hào)工程之后,將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")來代替)。或者將直接將jvm.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)