JNI调用实例

Posted 小路不懂2

tags:

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

1. 环境

Windows7-64Bit

VS2010-32Bit

JDK1.8-64Bit

2. 步骤

2.1 创建NativePrint类

public class NativePrint {
    public native void nativePrint();
}

其中包含一个native方法,这个native方法是通过C++实现的,C++的实现代码最终是生成dll文件,然后通过Java调用。

2.2 编译NativePrint类以及生成头文件

使用命令javac NativePrint.java编译,然后在通过javah NativePrint命令生成头文件,具体如下:

命令:

生成的文件:

其中NativePrint.h的文件内容为:文件内容不可以修改

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

#ifndef _Included_NativePrint
#define _Included_NativePrint
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     NativePrint
 * Method:    nativePrint
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_NativePrint_nativePrint
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif  

 2.3 C++实现NativePrint.nativePrint()方法

(1)安装VS2010版本,然后创建一个32位dll的空项目,具体步骤:文件 -> 新建项目 - > Win32 - > Win32控制台命令程序,然后下一步,做如下设置:

 

 

 

(2)拷贝

D:\\Program Files\\Java\\jdk1.8.0_111\\include\\win32\\jawt_md.h

D:\\Program Files\\Java\\jdk1.8.0_111\\include\\win32\\jni_md.h

D:\\Program Files\\Java\\jdk1.8.0_111\\include\\jni.h

NativePrint.h

四个文件拷贝到D:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\include,备注:具体目录请参考自己本地的jdk和VS2010的安装目录;

(3)在native_print工程的源文件目录下,创建NativePrint.cpp文件,内容如下:

#include <jni.h>  
#include <stdlib.h>  
#include <NativePrint.h>  
#ifdef __cplusplus  
extern "C" {  
#endif  
/*这个方法名称一定要和头文件的一模一样,不过头文件中的参数只有类型,没有名称,需要加成如下参数*/  
JNIEXPORT void JNICALL Java_NativePrint_nativePrint(JNIEnv *jenv, jobject jobj) {  
  /*就打印这一条语句*/  
  printf("=====888");  
}  
#ifdef __cplusplus  
}  
#endif 

2.4 编译64位的dll文件

2.4.1 配置64的编译环境

因为整个环境都是在64位进行,而VS2010的默认创建的工程都是32位的,需要修改。备注:如果不使用64位的dll则会报错 java.lang.UnsatisfiedLinkError: D:\\Program Files\\Java\\jdk1.8.0_111\\bin\\native_print.dll: Can\'t load IA 32-bit .dll on a AMD 64-bit platform

(1)点击工具栏上面的配置管理器,如图

(2)找到“活动解决方案平台(P)”点击新建

(3)选择x64,然后保存即可。

2.4.2 编译

然后按F7,就可以在工程目录下面生成一个与工程同名的dll文件,如下:注意是在x64目录下面

备注:如果在运行过程中遇到如下错误:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏, 请参考http://blog.csdn.net/kevin_mqj/article/details/22981873 

2.5 运行

将生成的dll文件拷贝到java.library.path目录下面,比如D:\\Program Files\\Java\\jdk1.8.0_111\\bin

创建一个测试java测试类,如Test.java

public class Test {
    static {
        System.loadLibrary("native_print");
    }

    public static void main(String[] args) {
        new NativePrint().nativePrint();
    }

}  

然后运行Test.java

结果截图:

参考资料

http://blog.csdn.net/oscar999/article/details/7895367

http://blog.csdn.net/seanwang_25/article/details/17285505

http://blog.csdn.net/l527719041/article/details/77434652

http://blog.csdn.net/fenglibing/article/details/4300381

http://blog.csdn.net/kevin_mqj/article/details/22981873

https://stackoverflow.com/questions/8113080/cant-load-ia-32-bit-dll-on-a-amd-64-bit-platform

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

JNI/NDK开发指南——调用构造方法和父类实例方法

JNI/NDK开发指南——调用构造方法和父类实例方法

Android JNI和NDK学习(09)--JNI实例二 传递类对象

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

Android NDK开发之Jni调用Java对象

java native interface JNI 调用Java方法