java Native Interface(JNI)是Java语言的本地编程接口
是Java 与操作系统本地代码互相调用的功能的接口
二、Java 调用C/C++步骤:1、在Java类中声明native方法新建一个 Java 工程 TestNativeCode 包 com.fomagic 类 Testnative
1 package com.fomagic;2 3 public class TestNative {4 public native void sayHello(); //C++本地代码实现 5 public static void main(String[] args) {6 7 }8 }2、使用javah命令生成包含native方法定义的C/C++头文件
1) 在VS中新建 Win32控制台应用程序 –> 确定 –> 下一步(即选择应用程序设置)
2) 拷贝三个文件到 项目目录下
com_fomagic_TestNative.h 第2步生成的头文件
jni.h 位于 JDK 下的include文件目录中
jni_md.h include—>win32目录
3) 添加现有项com_fomagic_TestNative.h 引入头文件(如图)
4) 新建 源文件 source.cpp 添加如下内容
5) 注意 引用的头文件“<>”代表从系统查找 、 “” “” 优先从本地查找
1 #include "com_fomagic_TestNative.h"2 #include <iostream>;3 using namespace std;4 5 //对 com_fomagic_TestNative.h 中声明的方法定义6 JNIEXPORT void JNICALL Java_com_fomagic_TestNative_sayHello (JNIEnv *evn, jobject obj)7 {8 cout<<"Hello World !"<<endl;9 }4、将C/C++源文件编译成动态链接库(DLL)可执行二进制代码
执行生成解决方案,在项目目录下的Debug 生成DLL 文件
5、把DLL文件所在路径添加到PATH环境变量下这个配置过Java环境变量的都应该是清楚的 ,这样可以方便Java程序直接调用当前的动态链接库
注意:需要注意的是Eclipse开发Java程序需要重启 来重新加载环境变量
6、java 类中加载DLL,然后调用声明的native方法1 package com.fomagic;2 public class TestNative {3 public native void sayHello(); //C++本地代码实现 4 public static void main(String[] args) {5 System.loadLibrary("NativeCode"); //加载动态链接库,不能加 .dll 6 TestNative test=new TestNative(); 7 test.sayHello(); 8 }9 }7、运行Java 项目
1) 执行结果 :Hello World !
2) 异常信息 : Can’t load IA 32-bit .dll on a AMD 64-bit platform
解决办法:
前文中提到的的Java引用DLL动态链接库时,执行结果的 异常信息为:Can’t load IA 32-bit .dll on a AMD 64-bit platform
原因:由于你的windows操作系统是64位,win32控制台程序默认生成 32位的 DLL 动态链接库
解决办法: 可想而知我们需要一个64位的DLL动态链接库,那就来生成一个
1、通过原来的VS项目 配置 (如图)
2、这时候生成则在 项目目录—-> x64 —->Debug 目录 生成 NativeCode.dll
3、同理,把DLL文件所在路径添加到PATH环境变量下 ,方便Java程序加载, Eclipse则需要重启重新加载环境变量
三、弊端及注意点转自:http://www.fomagic.com/index.php/232.html
新闻热点
疑难解答