草庐IT

JNI_OnLoad

全部标签

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实现。相反,不安全的方

java - 在 JNI 中构建数组时在 SetObjectArrayElement 之后使用 DeleteLocalRef

在JNI中,我通过调用SetObjectArrayElement()插入一个在JNI代码中本地创建的java对象来构造一个大数组。我的问题是,在使用SetObjectArrayElement()将对象插入数组后,数组是否存储了一个引用,以便我可以使用DeleteLocalRef释放对插入对象的本地引用? 最佳答案 是的。jobjectArray指向一个引用数组。当您将该数组的成员设置为本地引用时,您已经对该对象进行了第二次引用。如果删除本地引用,数组中的引用将保留。垃圾收集器不会处理实际对象,直到没有剩余的可访问引用为止。

Java JNI调用加载库

如果我有两个本地调用已编译C代码的Java类,并且我在另一个类中调用这两个类,是否会影响内存?例如,我有A类和B类,它们都调用了native函数。它们是这样设置的:publicclassA{//declarethenativecodefunction-mustmatchndkfoo.cstatic{System.loadLibrary("ndkfoo");}privatestaticnativedoublemathMethod();publicA(){}publicdoublegetMath(){doubledResult=0;dResult=mathMethod();returndR

java - 不能将 java int 传递给 jni 函数

我在test.cpp中有一个简单的jni函数:#include#includeextern"C"{JNIEXPORTjintJNICALLJava_dri_put(JNIEnv*env,jstringjs,jintji){printf("%d\n",ji);intt=ji;printf("%d\n",t);intk=-3412;returnk;}}我的java类javatest.java:publicclassjavatest{publicstaticvoidmain(Stringargs[]){System.loadLibrary("test");intt=134;intk=dri.

java - 通过 JNI 从 Applet 调用 DLL

我有一个“概念验证”作品,它跨越了一些不熟悉的领域。我的任务是将EFTPOS机器连接到一个应用程序,该应用程序在我们的内部网上的浏览器中作为小程序运行。我暂时忽略了EFTPOSdll,并用我选择的语言(Delphi)创建了一个简单的JNI装饰DLL,它只将一个字符串记录到c:\中的文本文件,我可以从本地成功调用它Java应用程序。但是,当我创建一个applet来做同样的事情时,将它编译成一个.JAR,对JAR签名并尝试在网页上通过Javascript调用applet中的方法,但它失败了。与我一起工作的一位高级Java人员认为不可能让它工作,因为允许applet这样做本质上是“邪恶的”。

java - 将字符串的数组列表从 native java 返回到 JNI

ArrayListmyArraylist;publicArrayListgetData(){myArraylist=newArrayList();myArraylist.add("1267982563");myArraylist.add("2345678");myArraylist.add("5432789");returnmyArraylist;}如何在JNI端从上述方法中获取每个项目并推送到vector并从JNI返回到JNI层中的其他CPP调用。 最佳答案 将ArrayList转换为std::vector:jclassjava_