有时候使用 GCC for Windows 生成 DLL 动态链接库时, 由于各种原因, 即使加载了动态链接库, JVM 仍然找不到符号, 从而产生 java.lang.UnsatisfiedLinkError 错误

  所以还是使用微软自家的 VS 来生成 DLL 比较妥当, 由于 VS 命令行错综复杂, 建议使用图形界面, 下面是配置要点.

  (1) 包含 jdk 目录下的 include 和 include\win32 目录, 便于查找 jni.h 和 jni_md.h

  (2) 如使用纯 C 代码, 则包含 jni.h 前插入代码 #undef __cplusplus 可使代码提示更友好.

  配置好后, 我们来实现一个 Java native 方法.

package pkg;

public class WinMessageBox {

	/**
* 弹出一个全局对话框
* @param label 窗口标题
* @param content 窗体内容
* @return 调用结果 */
public static native boolean showMessageBox(String label, String content); }

  使用 javah.exe 来生成一个声明了 WinMessageBox 类中需要实现的 native 方法的头文件

javah pkg.WinMessageBox

  得到文件 pkg_WinMessageBox.h , 使用 VS 实现它.

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class pkg_WinMessageBox */ #ifndef _Included_pkg_WinMessageBox
#define _Included_pkg_WinMessageBox
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: pkg_WinMessageBox
* Method: showMessageBox
* Signature: (Ljava/lang/String;Ljava/lang/String;)V
*/
JNIEXPORT jboolean JNICALL Java_pkg_WinMessageBox_showMessageBox
(JNIEnv *, jclass, jstring, jstring); #ifdef __cplusplus
}
#endif
#endif

  

#undef __cplusplus
#include "H:\Code\EclipseWorkSpace\TEST\bin\pkg_WinMessageBox.h" #include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h> JNIEXPORT jboolean JNICALL Java_pkg_WinMessageBox_showMessageBox(JNIEnv *env, jclass clazz, jstring label, jstring content){
MessageBoxW((HWND) NULL, (LPCWSTR) (**env).GetStringChars(env, content, 0), (LPCWSTR) (**env).GetStringChars(env, label, 0), MB_OK);
srand((UINT) time(0));
return rand() % 2 > 0 ? TRUE : FALSE;
}

  生成项目后, 编写测试

在这个过程中我们发现, 虽然我们需要使用动态链接库 JVM.dll 中的函数, 但是我们并不需要显式地去链接它, 这是因为我们的对 JVM 函数 的调用都是使用形参中传入的 JNIEnv 指针指向的 结构体对象指针 指向的 JNINativeInterface_ 结构体对象中的一张 函数指针表 调用的, Java 运行时会为我们打包 JVM 上下文, 并将这张表填好, 在调用本地方法时将其作为参数传入, 这样一来我们就可以在本地方法中使用表中的指针调用函数了.

[Java JNI] [Windows] [Visual Studio] [DLL] [UnsatisfiedLinkError]的更多相关文章

  1. Windows Visual Studio 下配置OpenGL

    很多同学不是很清楚OpenGL的配置,一个个帮忙配置也不是办法,干脆就写一篇教程好了. 本人使用的是Visual Studio 2015版本,对于Visual Studio 2012版本的配置会稍有不 ...

  2. OpenCV(c++)-1 安装和配置OpenCV4.4(Windows+visual studio 2019)

    @ 目录 安装OpenCV4 在Windows系统安装OpenCV4 配置visual studio 2019 配置包含路径 验证配置结果 安装OpenCV4 OpenCV是一个基于BSD许可(开源) ...

  3. Caffe on Windows (Visual Studio 2015+CUDA8.0+cuDNNv5)

    Title : Caffe (Visual Studio15+CUDA8+cuDNN5+python3.5) Author : SURFZJY Logo : True [TITLE] Requirem ...

  4. 通过Windows Visual Studio远程调试WSL2中的.NET Core Linux应用程序

    最近两天在Linux中调试.NET Core应用程序,同时我发现在Linux中调试.NET Core应用程序并不容易.一直习惯在Visual Studio中进行编码和调试.现在我想的是可以简单快速的测 ...

  5. windows Visual Studio 2017 编译 HEVC cmake-3.8.1-win64-x64.msi 下载

    ttps://github.com/OpenHEVC/openHEVC 下载一 直接下载源码(可选)或下载源码包,我这里下载的是源码 打开 Visual Studio () 去 github 找到源码 ...

  6. windows Visual Studio 上安装 CUDA【转载】

    原文 : http://blog.csdn.net/augusdi/article/details/12527497  前提安装: Visual Studio 2012 Visual Assist X ...

  7. [No0000113]Keyboard shortcuts for Windows Visual Studio Code

    General 常用Ctrl+Shift+P, F1 Show Command Palette 显示命令行Ctrl+P Quick Open, Go to File… 快速打开Ctrl+Shift+N ...

  8. [Windows] Visual Studio 2010 快捷键大全

    Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL ...

  9. windows visual studio 2015安装

    下载 首先到微软官方下载在线安装文件 https://www.microsoft.com 运行安装 点击运行后选择 自定义 选择安装功能,把sql server去掉,是数据库插件 点击下一步,中途会提 ...

随机推荐

  1. 每天一个Linux命令(05):tail命令

    tail命令用于输入文件中的尾部内容.tail命令默认在屏幕上显示指定文件的末尾10行.如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题.如果没有指定文件或者文件名为"-&qu ...

  2. css图片替换文字

    含义: 图像替代,就是像我们在平时将文本添加到文本中,然后通过css隐藏文本在它的位置上显示一个背景图片,这样,搜索引擎仍然可以搜到HTML文本,即使我们禁用css后,文本时仍然是可以显示的. 引用& ...

  3. Chemical table CFR500 div2D(并查集)

    给定的一个n*m的区域内,给出一些点的坐标,这些点上有一个元素,如果在矩形的子矩形的三个点都有元素,那么第四个点的元素可以自己产生,其他的元素需要购买,问最少需要购买多少中元素才可以把这个区域给填满. ...

  4. Jupyter Notebook 编辑器美化

    汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai 2018-10-10新增Linux样式路径: Logo: ~/anaconda3/lib ...

  5. JVM内存模型你只要看这一篇就够了

    JVM内存模型你只要看这一篇就够了 我是一只孤傲的鱼鹰 让我们不厌其烦的从内存模型开始说起:作为一般人需要了解到的,JVM的内存区域可以被分为:线程栈,堆,静态方法区(实际上还有更多功能的区域,并且这 ...

  6. A1115. Counting Nodes in a BST

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following propertie ...

  7. url加时间戳方法及作用

    速记:URL 的末尾追加了时间.这就确保了请求不会在它第一次被发送后即缓存,而是会在此方法每次被调用后重新创建和重发:此 URL 会由于时间戳的不同而稍微有些不同.这种技巧常被用于确保到脚本的 POS ...

  8. Vue+koa2开发一款全栈小程序(4.Koa入门)

    1.Koa是什么? 基于nodejs平台的下一代web开发框架 1.Express原班人马打造,更精简 2.Async+await处理异步 3.洋葱圈型的中间件机制 新建一个koa项目 1.打开cmd ...

  9. surfer画世界频率分布图(等高线、地点标注)

    以surfer 12版本为例: 1.下载世界地图,这里我随便提供一个范例(侵删,忘记出处了): 2.进入surfer软件,选择“MAP”——“NEW”——“BASE MAP”. 以此按照以上步骤,在弹 ...

  10. 怎么在linux下创建一个可运行脚本?

    1.touch hello.sh 2.vim hello.sh键入i插入#!/bin/shecho hello world;键入:esc:wq3.chmod 700 hello.sh 4. 执行./h ...