Tag: jni

如何从Java调用C ++?

我想从Java调用C ++方法。 我读到了JNI,但我没有得到如何获取所有库文件以及我应该保留它以便从命令行运行程序。 有没有办法从Eclipse本身调用C ++方法,因为我用它来运行Java类。

从Java调用C ++ DLL

我正在使用Java作为一个小应用程序。 它是对现有MFC项目的重写。 我需要更改现有的dll以使用JNI从Java启用访问。 所有这些Java的东西对我来说都是新的,所以当我阅读其他论坛post时,我遇到了一些麻烦并且感觉相当密集。 在现有的DLL中我有这样的函数: extern “C” __declspec(dllexport) bool Create() { return TRUE; } 愚蠢的提问时间。 如何正确设置它以供Java调用? 我试过这个: JNIEXPORT jboolean JNICALL Create() { return TRUE; } 我包括jni.h,一切都很好。 但是,当我从Java调用它时,我得到UnsatisfiedLinkError。 我用Java调用它: public static native boolean CreateSession(); System.load(“D:\\JavaCallTest.dll”); Create(); 有人可以向我推进正确的方向吗? 我真诚地感谢任何帮助。 谢谢, 缺口

如何获取已加载的JNI库列表?

正如主题所说的那样,Java中是否有一种方法可以获得在任何给定时间加载的所有JNI本机库的列表?

将静态库与JNI链接

Java 8之前的Java版本要求本机代码位于共享库中,但我已经阅读了Java 8,可以将静态链接库与JNI一起使用。 我搜索了一些例子,却找不到任何例子。 如何将JNI库静态链接到我的java应用程序?

64位系统上的Java Native Interface 32位dll

E:\Code\Java\JNITest>java test Exception in thread “main” java.lang.UnsatisfiedLinkError: E:\Code\Java\JNITest\test.dll: Can’t load IA 32-bit .dll on a AMD 64-bit platform 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.loadLibrary0(Unknown Source) at java.lang.System.loadLibrary(Unknown Source) at test.main(test.java:16)` 使用Java Native Interface时遇到了导致此错误的问题。 我相信这是因为我使用MinGW编译了.dll,它编译成32位.dll而我的系统是64位,因此我的Java运行在64位。 反正有没有迫使我的Java以32位运行?

如何使用Eclipse调试JNI代码(Java和C / C ++)

虽然我可以使用用于Java代码的Eclipse JDT调试器和用于C代码的GDB调试我的应用程序,但我更倾向于使用单个工具进行所有调试。 我找到了几个在Eclipse中启用“混合模式”调试的项目,并支持Java和本机代码之间的单步执行。 英特尔针对Java / JNI环境的集成调试器 Mariot Chauvin的代码之夏项目:支持JDT和CDT之间的无缝调试 不幸的是,一个声称是预发布质量,另一个目前没有维护。 是否有任何插件能够以可靠的方式为Eclipse带来混合模式调试function,还是应该继续使用两个单独的调试器?

通过JNI从Applet调用DLL

我有一个“概念certificate”的作品,跨越了一些不熟悉的领域。 我的任务是将EFTPOS计算机连接到在我们的Intranet上的浏览器中作为applet运行的应用程序。 我暂时忽略了EFTPOS dll并用我选择的语言(Delphi)创建了一个简单的JNI修饰DLL,它只是将字符串记录到c:\中的文本文件中,我可以从本地Java应用程序成功调用它。 但是,当我创建一个applet来做同样的事情时,将其编译成.JAR,签署JAR并尝试通过Javascript在applet中调用该方法失败。 我正在与之合作的一个高级Java人员并不认为有可能让它工作,因为允许applet执行此操作本身就是“邪恶的”。 您可以在java.policy文件中放入一个条目以允许loadLibrary。 以及allPermission和我在这些行中尝试了大量的变体,但无法在Java控制台中产生以下错误跟踪: java.lang.ExceptionInInitializerError at app.TestApplet.LogAString(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at sun.plugin.javascript.JSInvoke.invoke(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source) at sun.plugin.com.MethodDispatcher.invoke(Unknown Source) at sun.plugin.com.DispatchImpl.invokeImpl(Unknown Source) at sun.plugin.com.DispatchImpl$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at […]

如何将jstring转换为wchar_t *

假设在C ++方面,我的函数接受一个名为myString jstring类型的变量。 我可以将它转换为ANSI字符串,如下所示: const char* ansiString = env->GetStringUTFChars(myString, 0); 有没有办法得到 const wchar_t* unicodeString = …

连接到已经运行的JVM

有没有办法连接到已经运行的JVM? 例如,在JNI中,您可以使用JNI_CreateJavaVM创建VM并运行jar并检查其所有类。 但是,如果jar已经运行,我找不到附加到其JVM并与其类通信或获取其env指针的方法。 另一个问题是,如果jar加载我的本机库(.dll)并且我想在.dll中创建一个JVM,我不能..也不能在没有jar调用我的函数的情况下附加jar的当前JVM。 Java方面的示例: class Foo { static {loadLibrary(“Foo”)} } 在C ++方面: void Foo() { //CreateJVM //Attach to the current process.. //Call function from the jar that loaded me. } 如果没有jar先调用Foo就无法做到这一点。 有任何想法吗? 有没有办法获取当前的JVM或附加到它或外部的jvm实例?

在Java中在运行时为本机库添加新路径

是否可以在运行时为本机库添加新路径? (而不是使用属性java.library.path启动Java),因此在尝试查找nativeLibraryName时,对System.loadLibrary(nativeLibraryName)的调用将包含该路径。 这是可能的,或者这些路径在JVM启动后被冻结了吗?