JNI Hello World 不满意链接错误

2024-01-14

这是我第一次尝试 JNI。我的最终目标是让当前在计算机上运行的所有任务,但需要运行一个简单的示例。当我尝试执行主程序时,我不断收到此错误。我已经提供了我的简单 Java 主程序、生成的头文件和错误。

我不知道这个DLL可能依赖什么。它最初引用了我追踪到并放入 system32 中的 DLL (msvcr90.dll)。

下面是我用来编译 C 代码的命令,它生成了 DLL、OBJ、LIB、EXP 和清单文件。

cl -I"C:\Program Files\Java\jdk1.6.0\include" -I"C:\Program Files\Java\jdk1.6.0\include\win32" -MD -LD HelloWorld.c -FeHelloWorld.dll

class HelloWorld {
     private native void print();
     public static void main(String[] args) {
         new HelloWorld().print();
     }
     static {
         System.load("C:\\temp\\HelloWorld.dll");
     }
 }


#include <jni.h>
 #include <stdio.h>
 #include "HelloWorld.h"

 JNIEXPORT void JNICALL 
 Java_HelloWorld_print(JNIEnv *env, jobject obj)
 {
     printf("Hello World!\n");
     return;
 }

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

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    print
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_print
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

java.lang.UnsatisfiedLinkError: C:\temp\HelloWorld.dll: A dynamic link library (DLL) initialization routine failed
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(Unknown Source)
    at java.lang.ClassLoader.loadLibrary(Unknown Source)
    at java.lang.Runtime.load0(Unknown Source)
    at java.lang.System.load(Unknown Source)
    at HelloWorld.<clinit>(HelloWorld.java:7)
Exception in thread "main" 

不满意的链接错误可能意味着很多事情都出了问题。我会用

System.loadLibrary("HelloWorld");

代替

System.load();

正如二十英里建议的那样。

另外,在调用程序时,您需要(假设您的 DLL 与类文件位于同一目录中:

java -Djava.library.path=.你好世界

这是我制作的一个简单的演示,它调用 Win32 API 函数 (MessageBox)

Java类

class CallApi{
    private native String showMessageBox(String msg);
    private native double getRandomDouble();

    static{
        try{
            System.loadLibrary("CallApi");
            System.out.println("Loaded CallApi");
        }catch(UnsatisfiedLinkError e){
            //nothing to do
            System.out.println("Couldn't load CallApi");
            System.out.println(e.getMessage());
        }
    }

    public static void main(String args[]){
        CallApi api = new CallApi();
        double randomNumber = api.getRandomDouble();
        String retval = api.showMessageBox("Hello from Java!\n"+
            "The native random number: "+randomNumber);
            System.out.println("The native string: "+retval);
    }
}

生成的头文件

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

#ifndef _Included_CallApi
#define _Included_CallApi
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     CallApi
 * Method:    showMessageBox
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_CallApi_showMessageBox
  (JNIEnv *, jobject, jstring);

/*
 * Class:     CallApi
 * Method:    getRandomDouble
 * Signature: ()D
 */
JNIEXPORT jdouble JNICALL Java_CallApi_getRandomDouble
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

C DLL 代码

#include "CallApi.h"
#include <windows.h>
#include <stdlib.h>
#include <time.h>

#pragma comment(lib,"user32.lib")

JNIEXPORT jstring JNICALL Java_CallApi_showMessageBox
  (JNIEnv *env, jobject thisObject, jstring js)
{
    //first convert jstring to const char for use in MessageBox
    const jbyte* argvv = (*env)->GetStringUTFChars(env, js, NULL);
    char* argv =(char *) argvv;

    //Call MessageBoxA
    MessageBox(NULL, argv, "Called from Java!", MB_ICONEXCLAMATION | MB_OK);
    return js;
}

JNIEXPORT jdouble JNICALL Java_CallApi_getRandomDouble
  (JNIEnv *env, jobject thisObject)
{
    double num1;
    srand((unsigned)(time(0)));
    num1 = ((double)rand()/(double)RAND_MAX);

    return num1;
}

编译指令

我使用 Visual C++ Express 2008 cl 进行编译,删除了 -ML 标志,因为当 Java 代码尝试调用本机代码时它会导致异常:

cl /I"c:\Program Files\Java\jdk1.6.0_10\include" /I"c:\Program Files\Java\jdk1.6.0_10\include\win32" -LD CallApi.c -FeCallApi.dll

然后,运行代码:

java -Djava.library.path=.调用API

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JNI Hello World 不满意链接错误 的相关文章

  • 如何使用Spring WebClient进行同步调用?

    Spring Framework in 休息模板 https docs spring io spring framework docs current javadoc api org springframework web client R
  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • (Java) App Engine 中的静态文件无法访问

    The 示例文档 http code google com appengine docs java gettingstarted staticfiles html表示您只需将文件放在 war 或子目录 中 并且应该可以从主机访问它们 只要它
  • 您建议使用哪种压缩(GZIP 是最流行的)servlet 过滤器?

    我正在寻找一个用于大容量网络应用程序的 GZIP servlet 过滤器 我不想使用容器特定的选项 要求 能够压缩响应负载 XML Faster 已在大批量应用的生产中得到验证 应适当设置适当内容编码 跨容器移植 可选择解压缩请求 谢谢 我
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • 如何通过注解用try-catch包装方法?

    如果应该在方法调用中忽略异常 则可以编写以下内容 public void addEntryIfPresent String key Dto dto try Map
  • org/codehaus/plexus/archiver/jar/JarArchiver(不支持的major.minor版本49.0)-Maven构建错误

    下午大家 我在尝试构建项目时收到上述错误 我很确定这与使用 Java 1 6 编译的 Maven 最新更新有关 而我们尝试构建的项目是 1 4 项目 在此之前的插件工作没有问题 因此我将以下内容添加到 POM xml 文件中以尝试强制使用现
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 当 minifyEnabled 为 true 时 Android 应用程序崩溃

    我正在使用多模块应用程序 并且该应用程序崩溃时minifyEnabled true in the installed模块的build gradle 以下是从游戏控制台检索到的反混淆堆栈跟踪 FATAL EXCEPTION Controlle
  • 我们如何测试包私有类?

    我正在看书Effective Java in Item 13 Minimize the accessibility of classes and members 它提到 为了方便测试 您可能想让类 接口或成员更易于访问 这在某种程度上是好的
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • Play.application() 的替代方案是什么

    我是 Play 框架的新手 我想读取conf文件夹中的一个文件 所以我用了Play application classloader getResources Data json nextElement getFile 但我知道 play P
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • 我可以限制分布式应用程序发出的请求吗?

    我的应用程序发出 Web 服务请求 提供商处理的请求有最大速率 因此我需要限制它们 当应用程序在单个服务器上运行时 我曾经在应用程序级别执行此操作 一个对象跟踪到目前为止已发出的请求数量 并在当前请求超出允许的最大负载时等待 现在 我们正在
  • ECDH使用Android KeyStore生成私钥

    我正在尝试使用 Android KeyStore Provider 生成的私有文件在 Android 中实现 ECDH public byte ecdh PublicKey otherPubKey throws Exception try
  • 基于 Spring Boot 的测试中的上下文层次结构

    我的 Spring Boot 应用程序是这样启动的 new SpringApplicationBuilder sources ParentCtxConfig class child ChildFirstCtxConfig class sib

随机推荐

  • 当制作电子表格副本时,installedOnEdit 触发器也会被复制

    我有一个installedOnEdit使用触发器是因为我隐藏和取消隐藏根据条件受保护的列 现在 我已经由工作表所有者添加了触发器 我确实复制了此电子表格并与利益相关者共享以获取意见 在制作电子表格时 脚本确实会被复制 但触发器不会 这怎么可
  • Apache NetBeans 12.1 支持 JDK 15 吗?

    Oracle 最近发布了 JDK 15 我想知道最新版本的 NetBeans IDE Apache NetBeans 12 1 是否支持 JDK 15 我知道 NetBeans 并未正式支持 JDK 15 但我想问是否有人知道它非正式地支持
  • 使用PhpStorm IdeaVim,我无法使用shift+箭头键来选择单词

    我正在使用 PhpStorm 7 1 2 和 IdeaVim 插件 在插入模式下 我想使用选择单词Shift ArrowKey 然而 这个 IdeaVim 插件似乎阻止了这样做 我只能使用命令模式突出显示单词v key shift Home
  • 使用 IntentService 进行线程同步

    我正在尝试创建一个通过意图服务发出 HTTP 请求的应用程序 我需要应用程序等待服务完成其运行 即 让请求返回一些数据 然后再继续其操作 因为其操作涉及对我希望从 HTTP 请求接收的数据的操作 我已经尝试了多种方法 Semaphore C
  • iPhone 开发中的 Objective-C 属性

    Objective C 中属性和实例变量有什么区别 我需要用 OOP 术语来理解这一点 属性声明只是一个用于访问实例变量的便利包装器 在实现中使用 synthesize 吗 thanks 代码牛仔 属性和 ivars 是两个完全不同的东西
  • 在 Datagridview 中显示数据库搜索结果

    我在 Windows 窗体应用程序 c 中使用 Visual Studio 2013 和 SQL Server 2012 作为数据库 我想在一个中显示我的查询搜索结果DataGridView public void customerSear
  • 从命令行远程运行 Jmeter

    是否可以在本地计算机上没有 Jmeter 客户端的情况下在远程服务器上运行 Jmeter 我的意思是我可以从命令提示符在远程计算机上运行 jmeter bat 吗 这样它就可以在远程服务器上运行测试并将结果存储在那边的listener jt
  • Swift:使用闭包的枚举?

    我正在创建一个应用程序 可以将无限数量的规则应用于无限数量的节点 我计划使用核心数据作为数据存储 并在节点和规则之间创建简单的一对多关系 在 Objective C 中 我可能会为每个规则创建类并让它们符合协议 NSArray ruleCl
  • 覆盖主题 bootstrap 4 中的默认 $border-radius-lg 变量

    我在我的项目中使用 bootstrap 4 框架 我通过覆盖核心变量来主题化 如果我调整网格变量 它们会起作用 但是如果我尝试更新 border radius lgvar 没有发生任何改变 默认的 border radius lg尺寸仍在使
  • 在 asyncData Nuxt.js 中传递数据

    我是 nuxt js 的新手 我想问是否有任何方法可以在 asyncData 中传递数据 这是代码
  • 在 MVC 剃刀回发后保持下拉菜单选择状态?

    在 MVC 4 Web 中 我有包含以下示例代码的下拉列表 Html DropDownList Condition2 new SelectList Model Makes CCultureId CTitle All new class sp
  • 项目错误:QT 中的未知模块:多媒体

    我正在尝试编译qGo https github com pzorin qgo 安装后qt5 git clone https github com pzorin qgo git cd qgo qmake make sudo make inst
  • NumPy - 删除包含相同元素的子数组

    假设我有以下 4 x 3 x 3 数组 array 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 71 1 1 1 71 1 52 2 2 2 2 2 2 2 2 2 我想按以下标准过滤此类数组 将每个 3
  • 从 mediawiki api ios 过滤数据

    我使用 action query prop revisions rvprop content keywords format json redirects API 来获取有关 Anil Ambani 的详细信息 作为回应 我得到了以下内容字
  • 从 SQL Server 全文索引中获取前 n 个最新条目

    我在 SQL Server 2008 R2 数据库中有一个表 Article Id art text Id 是主键 art text 有全文索引 我搜索包含 house 一词的最新文章 如下所示 SELECT TOP 100 Id art
  • 如何使用 ViewPropertyAnimator 将 Width 设置为特定值

    如何使用 ViewPropertyAnimator 设置视图宽度 我可以缩放或平移 见下文 但无法设置为特定宽度 frame 1 animate scaleX 5 scaleY 5 start 但没有 frame 1 animate wid
  • 有没有办法在node.js客户端将字节数组转换为blob对象

    有没有办法从字节数组客户端获取 blob 对象而无需实际下载文件 我想传递 blob 对象的客户端 gt request get api get video blob d1 d2 d3 end err res gt if err conso
  • ASP.NET MVC 3 用户身份验证

    进行简单用户验证 帐户登录 的常用方法有哪些 另外 每个区域可以有不同的身份验证方案吗 Edit 我正在创建一个电子商务网站 需要为每个用户提供受保护的操作 那么我们该如何去做呢 它需要能够只允许经过身份验证的用户访问他们的信息 在 MVC
  • 如何获取URL中最后一个斜杠之前和倒数第二个斜杠之后的字符串[重复]

    这个问题在这里已经有答案了 如果我有一个如下所示的 URL http www example test1 test2 test3 http wwww example test1 test2 test3 我怎样才能检索字符串test3从上面的
  • JNI Hello World 不满意链接错误

    这是我第一次尝试 JNI 我的最终目标是让当前在计算机上运行的所有任务 但需要运行一个简单的示例 当我尝试执行主程序时 我不断收到此错误 我已经提供了我的简单 Java 主程序 生成的头文件和错误 我不知道这个DLL可能依赖什么 它最初引用