JAVA-Native方法的调用

新建java源文件:

public class HelloNative {
	static {
		System.load("HelloNative");
	}
	
	public static native void hellow();
	
	@SuppressWarnings("static-access")
	public static void main(String[] args) {
		new HelloNative().hellow();
	}
}

尝试编译后直接执行:

NativeDemo> javac HelloNative.java

NativeDemo> java HelloNative
Exception in thread "main" java.lang.UnsatisfiedLinkError: Can't load library: HelloNative
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.load0(Unknown Source)
        at java.lang.System.load(Unknown Source)
        at HelloNative.<clinit>(HelloNative.java:4)

NativeDemo> 

$ javah -jni HelloNative生成名为HelloNative.h的C头文件:

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

#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloNative
 * Method:    say_hellow
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloNative_say_1hellow
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

注意将自动生成的C头文件中第二行改为: #include “jni.h”

%JAVA_HOME%/include目录下的jni.h%JAVA_HOME%/include/win32目录下的jni_md.h两个文件复制到该目录下:

NativeDemo> tree /f
.
    HelloNative.h
    HelloNative.java
    jni.h
    jni_md.h

NativeDemo> 

编写相应的C实现:

#include "HelloNative.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloNative_hellow (JNIEnv *env, jclass cl) {
    printf("Hello Native!\n I\'m onefine.\n");
}

Windows下利用x64 Native Tools Command Prompt for VS 2019或者x86 Native Tools Command Prompt for VS 2019编译生成dll文件:

NativeDemo> cl -I JAVA_HOME\include -I JAVA_HOME\include\win32 -LD HelloNative.c -FeHelloNative.dll
用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.21.27702.2 版
版权所有(C) Microsoft Corporation。保留所有权利。

HelloNative.c
Microsoft (R) Incremental Linker Version 14.21.27702.2
Copyright (C) Microsoft Corporation.  All rights reserved.

/dll
/implib:HelloNative.lib
/out:HelloNative.dll
HelloNative.obj
  正在创建库 HelloNative.lib 和对象 HelloNative.exp

NativeDemo> 

其中,JAVA_HOME是含有JDK的目录如C:\Program Files\Java\jdk1.8.0_191,此可以在环境变量中配置,也可以使用绝对路径。

现在,该目录下的文件如下:

NativeDemo> tree /f
.
    HelloNative.c
    HelloNative.dll
    HelloNative.exp
    HelloNative.h
    HelloNative.java
    HelloNative.lib
    HelloNative.obj
    jni.h
    jni_md.h


 NativeDemo> 

编译Java代码并执行:

NativeDemo> javac HelloNative.java

NativeDemo> java HelloNative
Hello Native!
 I'm onefine.

NativeDemo> 


采用IDE来完成:Eclipse Java Photon && Visual Studio 2019

Java代码:


public class HelloNative {
	static {
		// temp_path: /D:/eclipse/javaProject/NativeDemo/bin/
		String temp_path = Class.class.getClass().getResource("/").getPath().replace("/", "\\");
		System.load(temp_path.substring(1, temp_path.length()-4) + "src\\HelloNative.dll");
	}
	
	public static native void say_hellow();
	
	@SuppressWarnings("static-access")
	public static void main(String[] args) {
		new HelloNative().say_hellow();
	}
}

直接运行出现错误:

Exception in thread “main” java.lang.UnsatisfiedLinkError: Can’t load library: D:\eclipse\javaProject\NativeDemo\src\HelloNative.dll
  at java.lang.ClassLoader.loadLibrary(Unknown Source)
  at java.lang.Runtime.load0(Unknown Source)
  at java.lang.System.load(Unknown Source)
  at HelloNative.(HelloNative.java:6)

VS2019创建C++动态库:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
项目右击生成:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
其余操作一致。

在这里插入图片描述


参考:

自己实现一个Native方法的调用 https://www.cnblogs.com/szlbm/p/5504603.html

VS2017创建C++动态库(DLL) https://blog.csdn.net/any1234567890/article/details/91491073

命令行中 javac、java、javap 的使用详解 https://blog.csdn.net/zhouxukun123/article/details/79121059

在windows下编译java文件、执行 https://jingyan.baidu.com/article/4d58d5412a5fca9dd4e9c025.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值