Java调用JNI

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java调用JNI相关的知识,希望对你有一定的参考价值。

因为要做点图形处理的项目,需要在Java中调用dll库,所以开发的第一步是研究了一下Java Jni的使用方法。话不多说,使用方法如下:

1、新建一个Java项目,比方说我的项目新建后结构是:

技术分享

 

2、上面新建的项目,我们要用的是JTest这个类,其他类可有可无(只是自己原先的项目代码懒得删~),其中,我们定义了一个方法名字,叫做sayHello(),注意,前边还有关键字  nativie

3、定位到工程目录路径,使用命令行工具,生成.class文件。 比如我的工作区间是在

技术分享

  

此时使用javah命令生成.h文件

技术分享

其中java中各个命令的意思是

-classpath <路径> 用于装入类的路径
-d <目录> 输出目录
-jni 生成 JNI样式的头文件(默认)

4、此时我们在e:/可以看到生成的.h文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_yyh_test_JTest */

#ifndef _Included_com_yyh_test_JTest
#define _Included_com_yyh_test_JTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_yyh_test_JTest
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_yyh_test_JTest_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

5、Java_com_yyh_test_JTest_sayHello方法是对JTest类中的本地方法sayHello()的声明。这个h文件相当于我们在java里面的接口,这里声明了一个Java_com_yyh_test_JTest_sayHello(JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致。

6、创建一个dll工程---Win32 Dynamic-Link Library工程。然后将上面生成的头文件com_test_TestNative.h添加到该工程中,然后创建一个源文件引用该头文件并且实现头文件中本地函数的功能:

技术分享

技术分享

这里因为com_test_TestNative.h中引入了jni.h所以要将jni.h加入到VC6.0安装目录下的Include目录中。jni.h在JDK安装目录下的include中,同时得件include/win32中的两个头文件jawt_md.h、jni_md.h也导入到工程中。

注意,用VC时,需要先把h文件拷贝进去文件夹中,再使用VC导入。

技术分享

 

 注意,选好x64或者其他版本,然后可以看到生成了一个dll文件。

接着,java调用本地函数:

技术分享

 

 

 注意,需要把dll路径配置到path中,并且配置好后,eclipse需要进行重启。



以上是关于Java调用JNI的主要内容,如果未能解决你的问题,请参考以下文章

Java本地调用(JNI)

深入了解android平台的jni---本地多线程调用java代码

浅谈如何用JNI的代码调用java接口

分析由 JNI 调用运行的 Java

[RK3568][Android11]JNI调用流程分析

[RK3568][Android11]JNI调用流程分析