问题标签 [jniwrapper]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
229 浏览

java - Java JNI 意外减速

我正在尝试在 Raspberry Pi 中为 RCSwitch 实现一个 java 包装器。它工作正常,直到抓取方法达到第 80 次迭代。然后它变慢了,我不知道为什么。返回值需要 5 分钟以上。我试图找出问题所在,但我并没有内存不足,覆盆子仍然有超过 300 兆。尽管如此,我还是尝试使用以下参数运行 JVM:-Xms5m -Xmx5m但程序在第 80 次迭代时仍然变慢,所以我认为这不是内存问题。我的发件人仍然发送该值,因为如果我重新启动程序,它会再次工作,直到第 80 次迭代,所以这不是缺少输入数据。

这是代码的java部分:

代码的 C++ 部分:

现在我很困惑,想不出解决办法。

提前致谢。

0 投票
0 回答
91 浏览

pointers - SWIGTYPE 指针赋值很慢

我正在使用 SWIG 通过 JNI 为 Java 包装某些 c++ 代码。

在Java中我有

我将数组传递给 C++ ,但是当 n 很大并且我必须这样做 1000 次时,它变得非常慢......

有没有更快的方法来做到这一点?具体来说:有没有办法在Java中创建一个数组并将整个东西一次传递给c++?

谢谢

0 投票
3 回答
1104 浏览

java - 如何将 C 结构的以下元素映射到 Java?

我有以下需要映射到 Java 的 C 结构。因为我需要从 C 代码生成的 DLL 中调用一个方法。以下是我的结构。

IPJ_READER_CONTEXT 和 IPJ_READER_IDENTIFIER 如下所示。

如何解析这两个元素以映射到 Java?请指教。

0 投票
1 回答
788 浏览

c++ - 可以直接从 C++ 调用 JNI c++ 方法吗?

是否可以从 c++ 调用 JNI c++ 方法(通常仅在 Java 中使用)假设有一个使用 JNI 方法的 Android 库,我想直接从我的 c++ 代码中使用这些方法,而不是创建 Java 层。这可能吗?我无法修改 JNI 方法,我不知道 JNI 方法会发生什么,所以我不能直接使用公共 c++ 方法,我不想将数据向上传递做 java 只是为了再次通过jni接口

0 投票
2 回答
3895 浏览

java - java.lang.UnsatisfiedLinkError:由于库未加载而找不到实现

当它说 jniLibs 和其他库中的 .so 文件无法加载时,我正在尝试将本机编写的共享库集成到我的应用程序中。

这是C文件

这是Java文件

下面给出了确切的错误

Android.mk文件如下

如果需要更多信息,请告诉我。谢谢。

0 投票
0 回答
421 浏览

java - 如果您知道方法签名,则为 DLL 文件创建 .h 文件

我正在尝试访问 Java 中 DLL 文件的方法。

我想使用ComfyJ为 DLL 文件创建一个包装器。ComfyJ 有一个向导,但是当我选择 DLL 文件时,它说它不能使用这种 DLL 文件。

COM 的 ComfyJ 向导

所以,接下来我尝试使用JNIWrapper向导,但它需要一个.h文件。问题是,我没有.h这个 DLL 的文件。

JNIWrapper 需要 .h 文件

(我有这两个工具的商业许可证)。

我有点惊讶没有办法.h为任何给定的 DLL 文件导出或创建文件。我搜索了互联网,但找不到任何能够做到这一点的工具。这让我觉得我仍然缺少一些信息,这些信息不在 DLL 文件中,但对于创建此.h文件是必需的。

其次,我确实知道所有方法名称、参数和返回类型。那是因为WinApiOverride工具可以为我列出它们。我什至可以看到在应用程序运行时哪些参数被传递给了这个 DLL 文件的函数/方法。

所以,我的印象是我拥有所有必需的信息。在我深入之前......我的问题:你认为我.h可以使用记事本手动创建这个文件吗?

法律说明:此 DLL 文件不是预安装的 DLL。它是我拥有有效商业许可证的商业应用程序的一部分。该公司表示,只要我仅将其用于个人用途,我就可以随意使用他们的 DLL 文件。

编辑:

我也尝试自己编写 jniwrapper 代码。结果看起来像这样:

结果是一个奇特的例外:

那个奇怪的方法名似乎是正确的形式。方法名称确实看起来很奇怪。我发现这是因为 C++“编码”了 dll 文件中的文件名。?FooAddBar@@YA_NHHH@Z实际上是bool FooAddBar (int, int, int)

尽管如此,JNIWrapper 似乎更喜欢编码名称。因为当我尝试使用短名称"FooAddBar"或其他任何东西时,我已经有一个异常,因为它找不到该方法。另一方面,当我使用编码的方法名称(即"?FooAddBar@@YA_NHHH@Z")时,它确实找到了方法,证明它是正确的。

但是,在调用期间,事情确实出错了。所以,我猜我使用了错误的参数或其他东西。显然,我做错了什么,并希望 JniWrapper 向导可以创建一个正确的包装器来解决这个问题。(但是,在这种情况下,我确实需要一个.h文件)。

0 投票
0 回答
1126 浏览

c++ - dyld:惰性符号绑定失败:找不到符号:预期在:平面命名空间

我最近将 OpenCv 更新到了 3.2.0 版,因此不得不重写我的一些 JNI 包装器。但是,现在它向我抛出了这个错误:

这是我使用该MSER::create功能的结果。我已经尝试返回一个新的地址Mat并且它没有出现错误,所以我相信这与其他人遇到的与 MacOS 和 dylibs 相关的类似错误无关(即其他人通常在加载库时遇到问题,而我的是仅与MSER::create)。相信我,我已经在网上搜索了至少 2 个小时来寻找解决方案,但我找不到。

这是我的 MSER.cpp 文件中的相关代码:

JNI 包装器的代码:

任何帮助,将不胜感激!

谢谢,
基拉

0 投票
1 回答
1264 浏览

java - 为什么当我在 64 位 jvm 中打开带有小程序的页面但在 32 位 jvm 中可以正常工作时,IE 11 会崩溃?

我有一个加载小程序的网页。如果我安装了 32 位 jre,一切正常,但是当我只有 64 位 jre 时,IE 11 一打开页面就会崩溃。

此外,当我同时保留 32 位和 64 位时,无论我在环境变量中保留什么,页面都会加载,但小程序由 32 位 jvm 运行,即使我没有将其路径放在任何地方。

32 位和 64 位版本相同,即 8u51。

我也试过禁用 IE 的所有附加组件,但没有运气。没有生成任何日志,所以我不知道在哪里看。

我能想到的唯一原因是存在一些dll冲突。我在小程序中使用 JNI。

另外,当我没有指定任何地方时,为什么它自己选择 32 位 jvm?

0 投票
1 回答
190 浏览

java - 如何将 jchararray 作为参数发送到 C 函数

我正在尝试在 android 应用程序中使用 C 库(预先编写和发布)。我开始着手围绕这个 C 库编写 JNI 包装器。我不知道如何jchararray正确传递给C。

我的 JNI 包装器看起来像

我已经通过在方法中打印它们来验证它们int[]是否可以很好地传递到 C 库。getData()但问题在于传递jcharArray data_char data[]

我已经data_使用(*env)->GetArrayLength(env, data_);. 当我在方法内部打印时Java_eg_test_freqProcessor,我看到

但是在getData()方法内部,如果我在同一个集合上进行迭代,我只会看到一半的数据。

这个库执行就地转换data[],我稍后需要访问它。我知道这jchar是一个大于的字节,char但我仍然无法理解处理这个问题的正确方法。

谢谢

0 投票
0 回答
188 浏览

c++ - C++ 中 JNI MethodCall 的包装函数

我的问题是:是否有任何好的解决方案来编写一个接收变量参数的包装函数,可以使用这些参数,但也可以将它们传递给任何 jni callmethod-function?我已经尝试过诸如可变参数函数之类的东西。我已经设法从函数接收变量参数,但我没有设法将这些变量参数传递给任何进一步的 jni 方法函数。我真的无法在 Internet 上找到有关此主题的帮助。希望你能帮助我。

}