另一个 JNI、C++、DLL、UnsatisfiedLinkError

2023-12-06

我已经找了两天了,没有任何解决方案可以帮助我,所以我们再次开始:

如何修复 JNI 中的 UnsatisfiedLinkError...?

这是我的java代码:

package org.lingenio.util;

import java.util.*;

public class PTAPIWrapperForOmegaT {

    private native String translateWithPTAPI(String sentence);

    private native void test();

    public PTAPIWrapperForOmegaT(String sentence) throws Exception{
        System.out.println(sentence);
        test();     
    }

    static {
        System.load("C:/Users/michael/Desktop/OmegaT/OmegaT2.3_src/native/PTAPIWrapperForOmegaT.dll");
    }
}

这是我的 C++ 代码:

    #include <iostream>
    #include <windows.h>
    #include <jni.h>
    #include "PTAPIWrapperForOmegaT.h"

    using namespace std;

    JNIEXPORT jstring JNICALL Java_PTAPIWrapperForOmegaT_translateWithPTAPI(JNIEnv *env, jobject obj, jstring sentence)
    {
/* stuff */
    }

    JNIEXPORT void JNICALL Java_PTAPIWrapperForOmegaT_test(JNIEnv *, jobject)
    {
        cout << "This comes from PTAPIWrapperForOmegaT.cpp test();" << endl;
    }


    int main(){
        return 0;
    }

以及头文件:

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

#ifndef _Included_PTAPIWrapperForOmegaT
#define _Included_PTAPIWrapperForOmegaT
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     PTAPIWrapperForOmegaT
 * Method:    translateWithPTAPI
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_PTAPIWrapperForOmegaT_translateWithPTAPI
  (JNIEnv *, jobject, jstring);

/*
 * Class:     PTAPIWrapperForOmegaT
 * Method:    test
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_PTAPIWrapperForOmegaT_test
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

以及我如何构建它:

call g++ -Wl,--add-stdcall-alias -c -DBUILDING_EXAMPLE_DLL -I G:/Software/Java/jdk1.7.0_01/include -I G:/Software/Java/jdk1.7.0_01/include/win32 PTAPIWrapperForOmegaT.cpp
call g++ -shared -Wl,-kill-at -o PTAPIWrapperForOmegaT.dll -I G:/Software/Java/jdk1.7.0_01/include -I G:/Software/Java/jdk1.7.0_01/include/win32 PTAPIWrapperForOmegaT.cpp

最后是错误:

10211: Error: Uncatched exception in thread [Thread-14] 
10211: Error: java.lang.UnsatisfiedLinkError: org.lingenio.util.PTAPIWrapperForOmegaT.test()V 
10211: Error:   at org.lingenio.util.PTAPIWrapperForOmegaT.test(Native Method) 
10211: Error:   at org.lingenio.util.PTAPIWrapperForOmegaT.<init>(PTAPIWrapperForOmegaT.java:13) 
10211: Error:   at org.omegat.core.machinetranslators.LingenioTranslate.translate(LingenioTranslate.java:32) 
10211: Error:   at org.omegat.core.machinetranslators.BaseTranslate.getTranslation(BaseTranslate.java:64) 
10211: Error:   at org.omegat.gui.exttrans.MachineTranslateTextArea$FindThread.search(MachineTranslateTextArea.java:122) 
10211: Error:   at org.omegat.gui.exttrans.MachineTranslateTextArea$FindThread.search(MachineTranslateTextArea.java:102) 
10211: Error:   at org.omegat.gui.common.EntryInfoSearchThread.run(EntryInfoSearchThread.java:85) 

我在这里不太清楚 g++ 的这两行,我认为第二行就足够了,但某些教程一定也提供了另一行,我保留了它。

我使用的是 Windows 7,使用 MingW 和最新的 Java(我相信是 1.7xxx)。

感谢任何帮助,我怀疑错误在于编译,但我只是不知道如何从这里继续。

EDIT:

使用 DependencyWalker 查看 dll,我可以看到这些函数的命名方式与我在 .cpp 文件中命名它们的方式相同。当然,我是从 Java 包装器中使用它们各自的名称来调用它们的,即 test()。这会是一个问题吗?过去经常使用 JNI 的人可以告诉我这是否是正确的方法?


事实证明所有代码都没有问题。其实我did编译头文件时出错。你可以看看头文件的函数名称,即:

JNIEXPORT jstring JNICALL Java_PTAPIWrapperForOmegaT_translateWithPTAPI
  (JNIEnv *, jobject, jstring);

现在,看看您的 Java 文件的包成员资格,在我的例子中:

package org.lingenio.util;

因为我确实以错误的方式编译了头文件,所以 JNI 后来无法找到它正在寻找的符号,因为它实际上是在寻找这个:

JNIEXPORT jstring JNICALL Java_org_lingenio_util_PTAPIWrapperForOmegaT_translateWithPTAPI(JNIEnv *env, jobject obj, jstring sentence)

所以,祝那些面临同样问题的人们好运。我显然不是最伟大的 Java 程序员,这就是为什么我不得不担心这个问题这么久。我应该首先以正确的方式编译我的头文件。 检查你的包和类路径!

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

另一个 JNI、C++、DLL、UnsatisfiedLinkError 的相关文章

  • 用于将类文件转换为 Java 源代码的 Eclipse 插件 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当源不可用时 是否有可用的 Eclipse 插件来反编译类文件 从 class 文件生成 java 源代码 类似于 Resharper 在
  • 从内存中获取Java类字节码(经过多次转换)

    我正在为 Minecraft 开发一个 coremod 并在加载许多类时对其进行转换 然而问题是 有多个 coremod 也转换了与我相同的类 并且我遇到了一些我想研究的奇怪行为 那么问题来了 经过多次转换后的字节码如何检查呢 当我转换它时
  • 如何使用 Moq 模拟 Web 服务调用?

    The using下面点击了我不想实际点击的外部资源 我想测试someResult以及使用它的代码 但每次我运行单元测试时 该代码仍然尝试访问真正的 Web 服务 如何使用最小起订量来伪造对 Web 服务的真实调用 但不模拟使用中的其余代码
  • winapi 函数的函数指针 (stdcall/cdecl)

    请有人给我一些为 MS winapi 函数创建函数指针的提示吗 我试图为 DefWindowProc DefWindowProcA DefWindowProcW 创建一个指针 但出现此错误 LRESULT dwp HWND UINT WPA
  • 如何使用SQL Server CE的动态连接字符串?

    我在 Windows 应用程序中使用 SQL Server CE 4 0 并使用实体框架创建它的模型 它工作正常 但我的问题是它没有构造函数来更改连接字符串 并且默认情况下它从app config file using var Contex
  • 结构体前向声明编译失败

    我有以下代码 但编译器说 sender wrapper 未定义 即使我向前声明了它 我不能对结构进行前向声明吗 用VS2003编译 struct send wrapper struct IPSend IPSend IPSend const
  • Fluent NHibernate 一对一映射

    我很难利用 Fluent NHibernate 的 HasOne 映射 基本上 A 类在 B 类中可以有匹配的 只有一条或没有 记录 请帮助定义关系的 AMap 和 BMap 类 谢谢 public class A public virtu
  • DISM.exe 返回代码?

    我有一个程序调用 dism exe 程序 它在后台运行一些命令 现在 我只检查返回代码 0 或其他任何内容 以显示进程失败或成功 我可以用什么来交叉检查返回代码以获得准确的返回错误 DISM 参考了哪些回报 评论中提供的链接DISMAPI
  • Qt 信号槽,新符号中的转换类型[重复]

    这个问题在这里已经有答案了 鉴于以下两个 connect ui gt comboBox SIGNAL activated QString ps SLOT requestPlotsAvailable QString connect ui gt
  • 修改排列算法以防止重复打印输出的策略

    我一直在审查实践算法 目前正在研究一种我非常喜欢的排列算法 void permute char set int begin int end int range end begin if range 1 cout lt lt set lt l
  • 如何解除阻塞在 ServerSocket.accept() 上的线程?

    我有一个带有以下代码的服务器线程 public void run try ServerSocket server EneaLog printLog Server is running server new ServerSocket this
  • 封闭实例的匿名类

    我正在阅读 Joshua Bloch 的 Effective Java 第二版 目前我在第 22 项 它描述了内部类和嵌套类 但我无法理解他这句话的意思 匿名类具有封闭实例当且仅当它们发生时 在非静态上下文中 有人能给我一个代码示例并解释它
  • 私有静态方法有必要吗?

    原理工程师 https stackoverflow com users 201787 metal在我上一家公司有一条规则private static方法应该作为实现文件中的函数实现 而不是作为类方法 我不记得他的规则是否有任何例外 我在目前
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • 当基类和派生类都具有同名变量时会发生什么

    考虑int a这些类中的变量 class Foo public int a 3 public void addFive a 5 System out print f class Bar extends Foo public int a 8
  • 升压参数库

    最近我发现参数 http www boost org doc libs 1 50 0 libs parameter doc html index htmlBoost 中的库 老实说 我不明白为什么这是 Boost 的一部分 当需要向函数传递
  • 虚拟继承 - 跳过构造函数

    我有以下课程 class Socket Socket Socket SOCKET s class Connection public virtual Socket Connection IP ip 这两个类包含一些纯虚函数和一些非虚函数以及
  • Java 中的 ConcurrentHashMap 和 Hashtable [重复]

    这个问题在这里已经有答案了 Java 中的 ConcurrentHashMap 和 Hashtable 有什么区别 哪个对于线程应用程序更有效 ConcurrentHashMap 和 Hashtable 锁定机制 Hashtable属于Co
  • 检测 Windows 重新启动是否是由于 Windows 更新造成的

    我的电脑上的一些应用程序一直在检测 Windows 更新是否重新启动 这是可以观察到的 因为它们会在 Windows 更新自动重启后重新启动 这非常有帮助 因为这些应用程序会重新加载更改 甚至unsaved更改或恢复选项卡 如果是浏览器 执
  • 在java中使用共享密钥加密/解密?

    我有客户令牌 我正在从一个 Web 应用程序 如 app1 发送到另一个 Web 应用程序 如 app2 我想加密客户令牌 在 app1 上 并使用在 app1 和 app2 上共享的密钥在 app2 上对其进行解密 我不知道如何开始 这将

随机推荐

  • 从 Java 中的另一个类访问变量的实例

    是否可以从 Java 中的另一个类访问一个类中变量的实例 假设您在 A 类中拥有以下内容 private BlockingQueue
  • 正则表达式检查两个第一个单词是否相同

    例如 s1 Test Test the rest of string s2 Test the rest of string 我想积极匹配 s1但不是 s2 因为第一个词 s1与第二个相同 单词 Test 例如 正则表达式应该适用于任何单词
  • 如何在JS中下载浏览器(包括Firefox)中的10个以上文件

    我尝试使用以下代码一次下载多个文件 var urls for var i 0 i lt urls length i var tempLink document createElement a tempLink setAttribute hr
  • 尝试编写一个通用函数来将 JSON 解析为可编码结构

    我目前正在像这样解析 JSON struct ExampleStruct Codable init implementation if let jsonData jsonString data using utf8 do let decod
  • UITableView iPhone SDK 中的延迟加载图像

    我需要在表视图中实现图像的延迟加载概念 以便首先向用户提供文本数据 然后向用户提供图像 我怎样才能在我的应用程序中实现这个 需要帮助 请 提前致谢 Shibin 我为我的项目创建的内容如下 通过 UITableViewCell Async
  • 为什么名为“del”、“return”等的对象属性是语法错误?

    我知道人们不应该能够替换 del return 等 关键字的行为 但我不明白为什么不可能这样做 myobj del mystr 解析器会将其与什么混淆 有办法允许吗 当然 我可以使用不同的名称 但我想在 AWS 工具 s3cmd 周围有一个
  • 嵌套模型中 mongoose-auto-increment 插件的问题

    我正在尝试增加procedureid doctorId每当 api 调用被触发时 我正在使用以下语法 但是 它给出了一个错误Treatment procedureid 1 dup key当我第二次通过浏览器调用api时 我可以看到 proc
  • 在视图中渲染数据之前在控制器中过滤数据

    你好 我是very new到 MVC5 Razor 和 EF 我已经寻找了两天 但仍然无法找到解决我的问题的方法 我想要做的是查看用户输入年份 季度和部门的视图 提交时 我希望另一个视图的控制器能够查看这些参数并在渲染视图之前过滤数据 目前
  • 计算列中零的百分比

    我在 DF df catch rate 中有一列捕获率数据 其中包含十进制值和零的组合 我想计算整列中零行的百分比 以表明它们对数据的贡献 mean df catch rate 会成功的 您可以添加参数na rm TRUE如果有NAs
  • AJAX 和 Coldfusion:执行数据库更新并反映更改而无需重新加载

    我在想象这里需要的解决方案时遇到问题 我正在处理的网站上有一个选择菜单 客户端希望能够选择一个名为 创建新源 的选项 然后会弹出一个 JS 窗口 其中包含一个空白字段 供用户选择输入新的原点 提交此表单后 数据库将被更新 选择菜单现在将包含
  • 使用 data.table 在单一条件下替换多列

    我想将默认值 255 更改为 NA dt lt data table x c 1 5 255 0 NA y c 1 7 255 0 0 z c 4 2 7 8 255 coords lt c x y 其中给出了以下代码 x y z 1 1
  • 字母数字的正则表达式,但至少一个字母

    在我的 ASP NET 页面中 我有一个输入框 必须对其进行以下验证 必须是字母数字 至少包含one字母 即不能是全部 数字 d a zA Z a zA Z0 9 基本上这意味着 零个或多个 ASCII 数字 一个 ASCII 字母字符 零
  • ConcurrentBag 是内存泄漏的原因吗? [复制]

    这个问题在这里已经有答案了 可能的重复 ConcurrentBag 中可能存在内存泄漏吗 我的应用程序中存在严重的内存泄漏 我在其中一种方法中添加到本地并发包集合中的所有数据从未被收集 这个简单的代码演示了我如何使用它 void Main
  • Mac OS X NodeJS:没有方法“路由器”错误

    使用 Mac Ports 在 MAC OS X 上安装 NodeJS v0 6 12 win764 node iwaldman which node opt local bin node win764 node iwaldman node
  • 如何将工作表复制到其他电子表格并将其移动到第一个(左侧)位置

    我正在使用我发现的脚本将活动工作表复制到文件夹中的所有其他电子表格 它工作得很好 但我实际上想要那张复印的纸被设置为其他电子表格中的第一个 最左侧 工作表 我知道 moveActiveSheet 但我似乎无法让它正常工作 我对脚本编写还是新
  • 通过 Jenkins 作为 Windows 服务运行时无法最大化浏览器

    通过 Windows 运行测试脚本时 我无法最大化浏览器窗口 因此脚本失败 尝试了该线程中提到的所有可能的方法 但没有用无法通过 Jenkins 中的 Selenium 设置 Chrome 浏览器的大小 增加大小 有没有办法最大化窗口 任何
  • Java Graphics2D Rotate 中的图像质量遭到破坏

    我在使用 Graphics2D 旋转方法旋转图像时遇到问题 这是我遇到的问题的图片 当我移动球时 图像在旋转时完全扭曲 这是我的旋转方法 public static void rotate BufferedImage img Rectang
  • 从内存中运行可执行文件

    我正在尝试直接从该可执行文件的 byte 表示形式作为 C 中的资源运行该可执行文件 所以基本上我想直接运行PE的一个字节 而不接触硬盘 我为此使用的代码曾经有效 但现在不再有效 该代码创建一个具有冻结主线程的进程 更改整个进程数据 最后恢
  • 设置文本视图+编辑文本+按钮

    我想在同一行中放置一个 TextView Edittext 和一个按钮 但我遇到的问题是该按钮未正确向左对齐 并且在小屏幕中 edittext 被整个填充 Small screen Big Screen 我的编码如下
  • 另一个 JNI、C++、DLL、UnsatisfiedLinkError

    我已经找了两天了 没有任何解决方案可以帮助我 所以我们再次开始 如何修复 JNI 中的 UnsatisfiedLinkError 这是我的java代码 package org lingenio util import java util p