什么是JNI呢 就是 java native interface 是 sun公司提供给我们的一个可以调用本地 非 java语言代码 的接口 .
JNI技术 实现了java调用本地方法 ,但是有破坏了 java的 跨平台性,因为 java代码可以一次编译处处运行 但是 其他语言则不可以
还有java是强类型语言 在进行 数据的传递过程中 参数类型的不同可能会导致错误
下面一个简单的例子 实现 java调用 C语言的函数
1、首先在java中定义一个 类和 mian函数 用 native关键字 将函数 hello声明为native方法 ,不用对方法进行实现
public class NativeTest
{
public native void hello() ; //java 本地方法
public static void main(String[] args)
{
System.loadLibrary("jnicode") ; //加载动态链接库 ,注意是动态链接库的名字
NativeTest s =new NativeTest() ; //实例化类
s.hello() ; //本地方法 也就是 利用C编写的函数调用
}
}
2、 用过动态链接库的都知道在调用动态链接库的函数的时候 在库内 都有对于函数的声明 ,在JNI中 从java方法到C/C++方法 声明的一个映射 比较麻烦 因此 sun公司
提供了 一个 javah.exe的工具 可以帮助我们生成 与 java本地方法相对应的 C/C++声明
下面是 javah的用法
用法:javah [选项] <类>
其中 [选项] 包括:
-help 输出此帮助消息并退
-classpath <路径> 用于装入类的路径
-bootclasspath <路径> 用于装入引导类的路
-d <目录> 输出目录
-o <文件> 输出文件(只能使用
-jni 生成 JNI样式的头文
-version 输出版本信息
-verbose 启用详细输出
-force 始终写入输出文件
我们在使用的时候只需要 javah 类名 -jni<可以省略因为是默认参数>
这样就可以生成一个 对应的.h头文件,我们要把类的路径加到classpath中或者 直接进入类所在的文件夹 否则有可能找不到指定的类
我这里用到的命令是 javah me.Native.NativeTest -JNI会生成 _NativeTest.h的头文件我这里将类放在 me.Native包中
_NativeTest.h内容
#include "jni.h"
#ifndef _Included_me_Native_NativeTest
#define _Included_me_Native_NativeTest
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_me_Native_NativeTest_hello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
3、 在 VS下创建一个 C/C++的空动态链接库工程 然后 追加头文件 到工程中 ,然后我们再建立一个源文件 吧 头文件中的 函数声明 拷贝到 源文件中
源文件代码
#include _me_Native_NativeTest.h" //包含生成的那个头文件
#include <iostream>
using namespace std ;
JNIEXPORT void JNICALL Java_me_Native_NativeTest_hello(JNIEnv * env, jobject obj)
{
cout<<"hello world "<<endl ;
}
4、完成上面的步骤还是不行 我们需要 跑到 JDK 的安装目录下找到 JNI.H 和 WIN32文件夹下 的 jni_md 拷贝到 工程下 然后 将这2个头文件 拷贝到工程目录下
并且增加到工程中去 。。 这样才算完成了
OK 一次简单的 JNI调用 C/C++ 函数完成
分享到:
相关推荐
赠送jar包:zstd-jni-1.4.3-1.jar; 赠送原API文档:zstd-jni-1.4.3-1-javadoc.jar; 赠送源代码:zstd-jni-1.4.3-1-sources.jar; 赠送Maven依赖信息文件:zstd-jni-1.4.3-1.pom; 包含翻译后的API文档:zstd-jni-...
赠送jar包:zstd-jni-1.3.8-1.jar; 赠送原API文档:zstd-jni-1.3.8-1-javadoc.jar; 赠送源代码:zstd-jni-1.3.8-1-sources.jar; 赠送Maven依赖信息文件:zstd-jni-1.3.8-1.pom; 包含翻译后的API文档:zstd-jni-...
赠送jar包:zstd-jni-1.4.4-3.jar; 赠送原API文档:zstd-jni-1.4.4-3-javadoc.jar; 赠送源代码:zstd-jni-1.4.4-3-sources.jar; 赠送Maven依赖信息文件:zstd-jni-1.4.4-3.pom;...双语对照,边学技术、边学英语。
赠送jar包:zstd-jni-1.3.2-2.jar; 赠送原API文档:zstd-jni-1.3.2-2-javadoc.jar; 赠送源代码:zstd-jni-1.3.2-2-sources.jar; 赠送Maven依赖信息文件:zstd-jni-1.3.2-2.pom;...双语对照,边学技术、边学英语。
假如有一个现有的 .dll/.so 文件,假如使用 JNI 技术调用,我们首先需要另外使用 C 语言写一个 .dll/.so 共享库,使用 SUN 规定的数据结构替换 C 语言的数据结构,调用已有的 ? dll/so 中公布的函数。 然后再在 Java...
android中AsyncTask和jni技术简单应用--附案例附代码
(1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以...
jni详解 JNI设计实践之路 JNI技术手册 Java_JNI_编程进阶 android_jni操作指南
本书共包括三部分: 1 、 第二章通过一个简单的例子介绍了 JNI。它的对象是对 JNI 不熟悉的初学者。 2, 3-10 章对 JNI 的特征进行了系统的介绍。我们会举大量的例子来说明 JNI 的各个特征, 这些特征都是 JNI 中重要...
前台java 后台c 结合技术----JNI @author:张宝东 @date:2020/4/1 目录 1问题调查 2java前台和c后台结合解决方案--jui介绍 3java前台Js画折线图和3d图 4jui入门测试 1问题...
AndroidJNI技术,最关键生成.h头文件的方法
Android调用C++接口调用技术Java Native Interface(JNI)详解,
jni4net文件64位,可以用于java调用C#的dll,提供相关的技术支持,使用时,需要将你的dll转换成jni的dll,然后再java项目中调用。
该技术文档包括JNI-NDK 开发指南 - v1.0,JNI编程指南,the java Native Interface英文原版和中文版
JNI完全技术手册,整合网上所有资料和详细用法
内容概要:公司技术分享PPT,介绍了Android JNI-NDK的基础知识 适合人群:具备一定编程基础,工作1-3年的研发人员
JNI技术手册.pdf jni详解.pdf JNI完全手册.doc
本文详细介绍了JNI-JAVA与C++的混和开发技术,使读者能轻松实现JAVA中调用C++模块。
在实践开发网格计算服务的过程中遇到了跨平台与服务运行效率的问题,在解决问题的过程中对Java的JNI技术进行了较深入的研究。对开发过程中使用JNI技术的重点和难点所作研究后的一个归纳和总结,并结合具体的开发实例...
(1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以...