草庐IT

java - JNI system.out 和 printf 行为

我正在编写一个程序,该程序使用JNI与一个简单的C程序进行交互。我创建了以下程序:publicstaticvoidmain(String[]args){Helloh=newHello();System.out.println("before");intnumber=h.sayHello();System.out.println(number);System.out.println("after");}和JNIEXPORTintJNICALLJava_Hello_sayHello(JNIEnv*env,jobjectobj){printf("HelloJNI\n");return10;}

java - 使用 JNI 从 C 调用 java 代码时发生内存泄漏

我有一个C程序,它使用JNI在java存储中存储一些对象。(在有人问之前,这里需要使用javastore,我必须用C编写一个客户端,它能够从这个store添加和检索对象)。我编写了程序并尝试添加100000个大小为1KB的对象。但是在仅添加50000个对象后,我收到“内存不足”消息(请注意,每当我无法使用NewStringUTF和NewByteArray函数分配新的字符串或字节数组时,我都会打印这些“内存不足”消息)。那时我的应用程序只使用了80MB的内存。我不明白为什么这些方法返回NULL。有什么我想念的吗。此外,即使我正在释放为java创建的字节数组和字符串,内存也会继续增加。这是

java - 在哪里可以找到 Mac OS 的 jni 头文件

我不是问我在我自己的电脑上哪里可以找到它,我是问我在哪里可以得到它。我已经完成了我的谷歌作业,但我没有在这些路径中找到标题。我的/System/Library/Java/JavaVirtualMachines/...中甚至没有Header文件夹,而且我的根目录下也没有Developer文件夹。现在我很确定我没有安装这些header,我检查了MacOS开发者网站,但我只发现了一些损坏的链接。OpenJDK或SunJDK不应该在某处为MacOS提供jni.hheader吗? 最佳答案 /Applications/Xcode.app/Co

java - 如何在 JNI 中将事件/信号从 C 发送到 Java

是否有任何机制可以通过JNI从C向Java或反之亦然发送异步事件/信号?我需要捕捉从C到Java的信号/事件。 最佳答案 这听起来有点棘手,因为JNI应该只是单向的:Java代码可以调用本地方法,当然它可以回调到Java代码中,但它本身不能启动该过程。但这并非不可能,我认为最直接的解决方案是让native调用阻塞,直到收到信号。另一种选择是编写JVMTI代理,它可以主动干扰正在运行的VM。但是,如果我们谈论的是UNIX信号,那么您可以使用非公共(public)API(因此在未来和SunVM特定的情况下无法保证)但现有的sun.mis

java - jprofiler "Hot Spot" View 是否正确说明了通过 JNI 调用的 native 代码消耗的 CPU?

我一直在使用JProfiler分析一段通过JNI调用nativeC代码的Java代码,但我从“CPUView”窗口中得到了奇怪的结果。特别是,“CallTree”选项卡上的信息告诉我调用native代码的Java方法消耗了最多的运行时间,但“HotSpots”选项卡甚至根本没有列出该方法。我还注意到org.joda.time类的类似情况,据报道它们占用了相当大的CPU部分,但并未报告为热点,我想知道这是否是因为它们花费大量时间调用原生日期转换代码。任何对此问题的见解都将不胜感激。编辑:我刚刚发现了一篇非常令人不安的学术论文,题为“EvaluatingtheAccuracyofJavaP

java - 有没有办法通过 JNI 将 Java 数组传递给 C 而无需复制它?

我理解使用GetDoubleArrayElements,是JVM决定是否复制Array的元素。这种情况下,有什么办法可以避免copy吗?如果没有,是否有其他方法可以在不复制的情况下从Java转移到C?我正在传递非常大的数组,我希望我能避免复制。谢谢 最佳答案 JNIguide说:InJDK/JRE1.1,programmerscanuseGet/ReleaseArrayElementsfunctionstoobtainapointertoprimitivearrayelements.IftheVMsupportspinning,th

java - 如何调试 JNI/C 库?

我们这里有一个系统,它使用JavaJNI调用C库中的函数。在Solaris上运行的一切。我在某个地方遇到了字符串编码问题。用C编写的函数返回一个阿拉伯字符,但JNI方法接收一个具有另一种编码的字符串。我已经尝试设置$NLS_LANG和用于编码的vm参数,但没有任何效果。所以我需要能够同时调试C代码和JavaJNI。调试它的最佳方法是什么? 最佳答案 dbx调试器(SunStudio的一部分)可以附加到JVM进程,让您在Java代码和native代码之间单步执行。该功能的代号为“jdbx”,尽管它都是dbx的一部分。它没有得到大力推广

java - ACR122 USB SDK - JNI 调用 Winscard.dll

我们购买了ACR122USBSDK用于NFC测试。我们想为ACR122U-A2NFC阅读器构建测试桌面应用程序。我们正在MicrosoftWindows7平台上用Java开发它。我们预计,为了从Winscard.dll使用PC/SC,我们需要进行JNI调用。为此,应准备用于JNI调用的C/C++包装器库。我认为这应该是SDK的一部分,因为示例应用程序引用了JNI包装器Jacspcsc.dll,但该库不存在。有没有人有类似的经历?是否有可用于Winscard.dll的JNI包装器?谢谢斯腾 最佳答案 如果您为阅读器安装了PC/SC驱动

java - 在JNI中,有没有比jlong​​更可移植的方式来封装指针呢?

我见过使用long/jlong​​允许Java对象保存到C++指针的示例:classFoo{privatenativelongcreate();}structFoo{};JNIEXPORTjlongJNICALLJava_Foo_create(JNIEnv*,jobject){return(jlong)(newFoo);}这让我感到有点紧张,因为它假定指针适合64位;例如在OS/400上这是不正确的。是否有更安全的解决方案,例如封装了C++指针的Java标准库类? 最佳答案 您可以使用哈希表来存储指针并将该哈希表的键返回给用户。喜欢

java - 为什么 JNI 调用本地方法比 sun.misc.Unsafe 中的类似方法慢?

我正在开发一个类似于sun.misc.Unsafe但具有扩展内存管理的JNI实现。为什么来自sun.misc.Unsafe和我开发的库的本地方法的调用时间截然不同?一些数字:sun.misc.Unsafe.getInt(address)需要~1ns当我的类似方法需要~10ns两种实现方式大体相同,都沿用了OpenJDK的源码,只是通过指针返回变量。两者的注册方式相同。如何加速JNI调用?是什么让不安全性能如此特别?谢谢,尤里/ 最佳答案 如果您在Unsafe类中寻找native方法的来源,您会发现它不使用JNI实现。相反,不安全的方