JNI静态注册全过程(Windows环境)
环境搭建
-
安装MinGW64,安装地址
https://sourceforge.net/projects/mingw-w64/files/
安装注意:
-
可下载在线安装工具,安装过程中Architecture选项,选择x86_64(我的电脑装的是64位系统,所以选择此项),然后等待安装完成。
-
安装完成后需要配置环境变量,
环境变量路径:MinGW64\mingw64\bin\
-
CMD中执行g++后提示如下,说明安装成功
g++.exe: fatal error: no input files compilation terminated.
-
-
Java环境的搭建,环境变量需要配置
代码编写
涉及文件:
-
HellpNative.java
-
HelloNative.class
-
nativejava_HelloNative.h
-
HelloNative.cpp
-
Java文件中内容
HellpNative.java
public class HelloNative { static { System.load("HelloNative64.dll"); } public static void main(String[] args) { HelloNative hn = new HelloNative(); System.out.println("=====" + hn.showText("222")); } public native String showText(String name); }
注意:
-
Windows环境下编译出来的是dll文件,Linux下编译出的是so文件,所以一般安卓多数时候调用的是so文件
-
Java调用dll库的时候有两种方式:
System.loadLibrary(“Dll2”); // 只需要写dll的文件名,将dll文件放在C盘system文件夹下 System.load(“d:\\Dll2”); //需要写文件夹的路径,绝对路径
-
-
编译java文件
老版本的javac与javah是分开的需要两部操作
新版本的java直接一步将java文件编译出.class与.h文件
javac -h ./ HelloNative.java
生成文件:
HelloNative.class
nativejava_HelloNative.h
-
通过编译的HelloNative.class生成的nativejava_HelloNative.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class nativejava_HelloNative */ #ifndef _Included_nativejava_HelloNative #define _Included_nativejava_HelloNative #ifdef __cplusplus extern "C" { #endif /* * Class: nativejava_HelloNative * Method: showText * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_nativejava_HelloNative_showText (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif
其中以下方法需要复制保留,系统根据java文件中的native方法生成的标准格式的方法
javac -h命令的目的就是为了获取下面的方法名称
java中的native方法静态与非静态方法生成的参数是不一样的,需要注意
JNIEXPORT jstring JNICALL Java_nativejava_HelloNative_showText (JNIEnv *, jobject, jstring);
-
cpp文件的编写,将上面编译出来的方法放倒cpp文件中
注意:
-
在方法前面加上extern “c”
-
传入参数为JNIEnv *env,
-
需要将jni.h复制到cpp文件目录中,有两个文件需要复制
jdk\include\jni.h
jdk\include\win32\jni_md.h
以上步骤完成以后cpp文件中就不会报错
#include <iostream> #include "jni.h" extern "C" JNIEXPORT jstring JNICALL Java_nativejava_HelloNative_showText (JNIEnv *env, jobject, jstring){ return env->NewStringUTF("get jni from native"); } int main() { std::cout << "Hello, World!" << std::endl; return 0; }
-
-
编译cpp文件
windows环境调用的话是dll,linux是so,根据具体需求编译生成
g++ main.cpp -shared -o main.dll
本文中生成文件:
main.dll
-
将main.dll文件复制到自己需要的位置
-
执行java文件完成native方法的调用
由于第一次安装的MinGW不是64位的编译出来的.dll文件调用的时候系统提示不是64位的,把之前的删了重新下个64位的就搞定了