[Java JNI] [Windows] [Visual Studio] [DLL] [UnsatisfiedLinkError]
有时候使用 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]的更多相关文章
- Windows Visual Studio 下配置OpenGL
很多同学不是很清楚OpenGL的配置,一个个帮忙配置也不是办法,干脆就写一篇教程好了. 本人使用的是Visual Studio 2015版本,对于Visual Studio 2012版本的配置会稍有不 ...
- OpenCV(c++)-1 安装和配置OpenCV4.4(Windows+visual studio 2019)
@ 目录 安装OpenCV4 在Windows系统安装OpenCV4 配置visual studio 2019 配置包含路径 验证配置结果 安装OpenCV4 OpenCV是一个基于BSD许可(开源) ...
- Caffe on Windows (Visual Studio 2015+CUDA8.0+cuDNNv5)
Title : Caffe (Visual Studio15+CUDA8+cuDNN5+python3.5) Author : SURFZJY Logo : True [TITLE] Requirem ...
- 通过Windows Visual Studio远程调试WSL2中的.NET Core Linux应用程序
最近两天在Linux中调试.NET Core应用程序,同时我发现在Linux中调试.NET Core应用程序并不容易.一直习惯在Visual Studio中进行编码和调试.现在我想的是可以简单快速的测 ...
- windows Visual Studio 2017 编译 HEVC cmake-3.8.1-win64-x64.msi 下载
ttps://github.com/OpenHEVC/openHEVC 下载一 直接下载源码(可选)或下载源码包,我这里下载的是源码 打开 Visual Studio () 去 github 找到源码 ...
- windows Visual Studio 上安装 CUDA【转载】
原文 : http://blog.csdn.net/augusdi/article/details/12527497 前提安装: Visual Studio 2012 Visual Assist X ...
- [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 ...
- [Windows] Visual Studio 2010 快捷键大全
Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL ...
- windows visual studio 2015安装
下载 首先到微软官方下载在线安装文件 https://www.microsoft.com 运行安装 点击运行后选择 自定义 选择安装功能,把sql server去掉,是数据库插件 点击下一步,中途会提 ...
随机推荐
- python3 元组tuple
元组应小括号()表示: tuple(seq)将列表转换为一个元组: 不可变的,元组是不可变,但元素可以是可变数据类型: 可以迭代,可以切片: +连接元组,*复制元组: del不可以删除元素,但可以删除 ...
- Android LinearLayout 渐变背景
更多 参考 Drawable Resources | Android Developers main_header.xml: <?xml version="1.0" enc ...
- pip 安装第三方包提示Unknown or unsupported command 'install'
Unknown or unsupported command 'install' Unknown or unsupported command 'show' Unknown or unsupporte ...
- iis express添加虚拟目录
在调试WEB时,还是使用IIS EXPRESS比较方便, 在IIS中,选择网站,右击,添加虚拟目录或者应用程序,就能添加虚拟目录了.. 在IIS EXPRESS中,添加虚拟目录如下 1.右击IIS E ...
- [APIO2013]机器人(斯坦纳树)
题目描述 VRI(Voltron 机器人学会)的工程师建造了 n 个机器人.任意两个兼容的机 器人站在同一个格子时可以合并为一个复合机器人. 我们把机器人用 1 至 n 编号(n ≤ 9).如果两个机 ...
- Privoxy将Socks代理转化HTTP代理
使用步骤 安装Privoxy sudo pacman -S privoxy # Arch Linux 创建配置文件 mkdir -p ~/.config/privoxy 向~/.config/priv ...
- 洛谷P1463 反素数
经典题了,很难想到这TM是搜索...... 题意:求[1, n]中约数最多的数中最小的. 解:我们有约数个数定理. 所以考虑通过枚举每个质因数个数来直接计算出约数个数. 然后就可以搜索了. 注意:若p ...
- DP题组
按照顺序来. Median Sum 大意: 给你一个集合,求其所有非空子集的权值的中位数. 某集合的权值即为其元素之和. 1 <= n <= 2000 解: 集合配对,每个集合都配对它的补 ...
- 笔记:用标准c写 com dll
在 [XXX.idl] 中 1. 如果想在脚本语言中传递一个值,并且在dll(c代码)中修改这个值并返回的话, 这个参数必须写为:[in, out] VARIANT* 如果写成 [in, out] i ...
- Mysql DML DCL DDL
在介绍这些SQL语言之前,先罗列一下mysql的常用数据类型和数据类型修饰,供查询参考 后面的带数字表示此类型的字段长度 数值型: TINYINT 1 ,SMALLINT 2,MEDIUMINT 3 ...