已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
通过JNI实现Java和C+的相互调用 通过JNI实现Java和C+的相互调用一、从Java调用C+的DLL1. 创建Java文件创建名为TestNative的Java文件,注意包名。package org.druze.test;publicclass TestNative publicnativevoid sayHello(); publicvoid sayHello2() System.out.println(Say Hello From Java); 如代码所示,对于sayHello方法声明为native,这一部分将由C+的动态库来实现。2. 生成class文件使用javac org/druze/test/TestNative.java生成class文件注意:执行该命令在org所在目录执行。3. 使用javah命令生成相应的C+头文件使用javah org.druze.test.TestNative生成名为org_druze_test_TestNative.h的头文件注意:执行该命令在org所在目录执行。该头文件的内容如下:/* 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 _cplusplusextern 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#endif4. 创建C+解决方案此处以VS2008为例。新建一个VC+的Win32项目,选择如图所示的控制台应用程序。项目名称为NativeCode。点击确定后,再点击下一步,出现该页面,应用程序类型选择DLL,附加选项选择DLL5. 创建号工程之后,将org_druze_test_TestNative.h导入到工程里面,并创建名为source.cpp的源代码,内容如下:#includeorg_druze_test_TestNative.h #include using namespace std; JNIEXPORT void JNICALL Java_org_druze_test_TestNative_sayHello(JNIEnv *env, jobject obj) coutHello World!选项-项目和解决方案-VC+目录菜单中,平台选择Win32,选择“显示以下内容的目录”为“包含文件”,导入jni.h和jni_md.h的路径。7. 编译,生成NativeCode.dll,并将其copy到环境变量PATH的路径下。8. 修改TestNative.javapackage org.druze.test;publicclass TestNative publicnativevoid sayHello(); publicstaticvoid main(String args) / 加载动态连接库DLL,如果没有找到的话,则会在运行时报错 System.loadLibrary(NativeCode); TestNative tnt = new TestNative(); tnt.sayHello(); publicvoid sayHello2() System.out.println(Say Hello From Java); 运行,显示“Hello World!”9. 注意头文件jni.h和jni_md.h可以直接导入到工程中也可以。10.注意NativeCode.dll必须放置在java命令能访问的路径中。二、从C+调用Java1创建TestNative2.Javapackage org.druze.test;public class TestNative2 public static void testPrint() System.out.println(this is from static method); Public static int testReturn() return 22; Public static int testInput(int number) return 22+number; publicint testInstance(int number) System.out.println(this is from instance method); return 11+number; 2在VS2008中创建win32控制台的应用程序,命名为NativeCode2,在向导中选择空项目。3在工具-选项-项目和解决方案-VC+目录菜单中,平台选择Win32,选择“显示以下内容的目录”为“包含文件”,导入jni.h和jni_md.h的路径。或直接把jni.h和jni_md.h导入到工程中。4在工具-选项-项目和解决方案-VC+目录菜单中,平台选择Win32,选择“显示以下内容的目录”为“包含文件”,导入jvm.lib的路径,并在项目-NativeCode2属性-配置属性-链接器-命令行中添加jvm.lib(这一步或者使用#pragma comment(lib,jvm.lib)来代替)。或者将直接将jvm.lib添加到工程中。5创建Test.cpp#include #include using namespace std;int main() JavaVMOption options1; JNIEnv * env; JavaVM * jvm; JavaVMInitArgs vm_args; options0.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) coutCan not create JVMFindClass(org/druze/test/TestNative2); printf(getClsn); coutclsGetStaticMethodID(cls, testReturn, ()I); printf(getMidn); if (mid !=0) printf(testReturnn); int result=env-CallStaticIntMethod(cls, mid); printf(call over result=%dn,result); mid = env-GetStaticMethodID(cls, testPrint, ()V); if (mid !=0) printf(testPrintn); env-CallStaticVoidMethod(cls, mid); mid = env-GetStaticMethodID(cls, testInput, (I)I); if (mid !=0) printf(testInputn); int result=env-CallStaticIntMethod(cls, mid,22); printf(call over result=%dn,result); mid = env-GetMethodID(cls,()V); if (mid != 0)/获取方法成功 printf(ctro!=0n); jobject obj=env-NewObject(cls, mid); printf(new objectn); mid = env-GetMethodID(cls, testInstance,(I)I); if (mid!=0)/获取方法成功 printf(methodID!=0n); jint result=env-CallIntMethod( obj, mid,22); coutresultDestroyJavaVM(); system(Pause); return 0;6将jvm.dll目录添加到PATH环境变量中,将org/druze/test/TestNative2复制到debug目录下执行。7头文件和库文件的配置VC6和VC2008类似,菜单名称有所改变。VC6中,配置头文件和库文件的目录在,工具(Tools)-选项(Options)-目录(Directories)里面的头文件”Include files”和库文件”Library files”.添加相应的目录工程(Project)-设置(Setting)-链接(Link)-object/module library后面添加jvm.libCodeBlocks在Project-Build options-Linker setting and Search directories中配置相应路径。8.按如下结构组织可不用配置jvm.dll到环境变量中创建存放目录Run(下面的文件目录在JDK安装目录中都能找倒):Run(手工建立目录)-bin(手工建立目录) -classic(手工建立目录) -jvm.dll(文件,JDK安装目录中有) -自己的JAR包,如果是class文件把包目录和文件一起拷贝过来 如果是jar文件,需要在options1.optionString = -Djava.class.path=.;./swt.jar;中设置 -JniC.exe,C调用JAVA的程序 -hpi.dll(文件,JDK安装
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 衡水基金从业资格考试及答案解析
- 未来五年水下采油树、防喷器行业市场营销创新战略制定与实施分析研究报告
- 校园文化评审与改进机制建设
- 交通检测设备项目可行性分析报告范文
- 工业园区消防安全大数据分析平台方案
- 极限轮滑裁判试题及答案
- 造价工程师考试建设工程计价案例分析(公路)试题及答案
- 管网探测与应急处理技术集成方案
- 怎样的AI+数智应用创新管理系统能真正提升科技管理效率与价值创造
- 英语以读促写教学的主题语境优化策略
- 2025年麻醉临床信息系统项目合作计划书
- 人工智能通识 课件 第五章 自然语言处理与大数据
- 围术期镇痛管理
- 2025浙江凯航物产有限公司招聘12人考试笔试备考试题及答案解析
- 上海落户业务培训
- 广西华盛集团北海裕泰工艺有限责任公司招聘笔试题库2025
- 2025贵州毕节市公安局七星关分局面向社会招聘警务辅助人员280人考试笔试参考题库附答案解析
- 2027届普通高等学校招生全国统一考试青桐鸣大联考(高二)数学(人教版)
- 2025年公安基础知识考试题库及答案
- (2025)入团积极分子题库和答案(完整版)
- 2025-2030智慧渔业发展现状分析及未来趋势与产业化研究
评论
0/150
提交评论