一次搞定JNI静态注册全过程(Windows)

5 篇文章 0 订阅

JNI静态注册全过程(Windows环境)

环境搭建

  1. 安装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.
      
  2. Java环境的搭建,环境变量需要配置

代码编写

涉及文件:

  • ​ HellpNative.java

  • ​ HelloNative.class

  • ​ nativejava_HelloNative.h

  • ​ HelloNative.cpp


  1. 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”); //需要写文件夹的路径,绝对路径
      
  2. 编译java文件

    老版本的javac与javah是分开的需要两部操作

    新版本的java直接一步将java文件编译出.class与.h文件

    javac -h ./ HelloNative.java
    

    生成文件:

    HelloNative.class

    nativejava_HelloNative.h

  3. 通过编译的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);
    
  4. 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;
    }
    
  5. 编译cpp文件

    windows环境调用的话是dll,linux是so,根据具体需求编译生成

     g++ main.cpp -shared -o main.dll
    

    本文中生成文件:

    main.dll

  6. 将main.dll文件复制到自己需要的位置

  7. 执行java文件完成native方法的调用

    由于第一次安装的MinGW不是64位的编译出来的.dll文件调用的时候系统提示不是64位的,把之前的删了重新下个64位的就搞定了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值