一、Java调用C/C++代码
来源:互联网 发布:阿里巴巴怎么传淘宝 编辑:程序博客网 时间:2024/05/29 17:58
一、什么是JNI
Java Native Interface(JNI)是Java语言的本地编程接口
是 Java 与操作系统本地代码互相调用的功能的接口
二、Java 调用C/C++步骤:
1、在Java类中声明native方法
新建一个 Java 工程 TestNativeCode 包 com.fomagic 类 Testnative
package com.fomagic; public class TestNative { public native void sayHello(); //C++本地代码实现 public static void main(String[] args) { }}
2、使用javah命令生成包含native方法定义的C/C++头文件
3、按照生成的C/C++头文件来写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) 注意 引用的头文件“<> ”代表从系统查找 、 “ ” “ ” 优先从本地查找
#include "com_fomagic_TestNative.h"#include <iostream>;using namespace std; //对 com_fomagic_TestNative.h 中声明的方法定义JNIEXPORT void JNICALL Java_com_fomagic_TestNative_sayHello (JNIEnv *evn, jobject obj){ cout<<"Hello World !"<<endl;}
4、将C/C++源文件编译成动态链接库(DLL)可执行二进制代码
执行生成解决方案,在项目目录下的Debug 生成 DLL 文件
5、把DLL文件所在路径添加到PATH环境变量下
这个配置过Java环境变量的都应该是清楚的 , 这样可以方便Java程序直接调用当前的动态链接库
注意:需要注意的是Eclipse开发Java程序需要重启 来重新加载环境变量
6、java 类中加载DLL,然后调用声明的native方法
package com.fomagic;public class TestNative { public native void sayHello(); //C++本地代码实现 public static void main(String[] args) { System.loadLibrary("NativeCode"); //加载动态链接库,不能加 .dll TestNative test=new TestNative(); test.sayHello(); }}
7、运行Java 项目
1) 执行结果 : Hello World !
2) 异常信息 : Can’t load IA 32-bit .dll on a AMD 64-bit platform
(大概意思就是 64位的AMD 平台不能加载32 位的 .dll 文件) 解决办法看这里
三、弊端及注意点
- 使用JNI,这个java Application 将不能跨平台,如果要移植到别的平台上,则 native代码需要重新进行编写
- java是强类型语言,而C/C++则不是,因此,必须在写JNI时更加小心
- 在构建java程序的时候,尽量少用本地代码
- 一、Java调用C/C++代码
- C调用java代码
- C调用java代码
- java 调用C代码
- c代码调用java代码
- JNI java调用c代码 (一)静态注册
- java调用c/c++代码
- java调用c/c++代码
- NDK Java 调用 C代码
- Java代码中调用C/C++代码
- 从 C/C++ 程序调用 Java 代码
- 使用JNI,让java调用c代码
- 从 Java 程序调用 C/C++ 代码
- 从 C/C++ 程序调用 Java 代码 .
- JNA java调用c/c++代码
- java中调用C语言代码
- java中调用C语言代码
- 从 C/C++ 程序调用 Java 代码
- c# winform做的SqlServer数据库服务器连接配置登录界面
- 电脑上玩微信 - 文卓爷 Windroye 模拟器 -Android模拟器
- 有关cookie的httponly属性相关
- android View实现变暗效果
- [BAT]批处理安装Java并配置环境变量
- 一、Java调用C/C++代码
- Linux移植(2)启动文件
- 多路归并排序
- Java中urlrewrite伪静态的使用总结
- 二、C++访问Java代码-知识点
- Spring3.x--通过构造器注入
- 图像阈值分割(二值化)
- QT5与QT4的一些不同之处
- 自定义 searchResultsTableView的样式