jjzjj

JNI_CreateJavaVM

全部标签

java - 通过 log4j 发送 JNI C stderr/stdout

我的java应用程序使用JNI调用用C编写的库。这个native库将错误记录到stderr,但我想通过我的log4j记录器以某种方式重定向错误流。这可能吗?C库是外部的-我没有源代码,所以无法更改它。谢谢 最佳答案 注意:我没有尝试过这个答案;YMMV.POSIX方法freopen将更改与流关联的基础文件。正如联机帮助页所述:“freopen()函数的主要用途是更改与标准文本流(stderr、stdin或stdout)关联的文件”。因此,您可以创建自己的JNI库,它只需将流重定向到一个文件中。但是,要使这项工作有几个严重的障碍:您需

java - JNI 调用与常规 Java 调用交错 - 执行顺序是什么?

我最近一直在试验JNI,以便移植一些现有的C++库。作为测试的一部分,我创建了一个简单的“helloworld”程序。我在C++中调用一个简单的native函数,它只打印消息。我对我在执行程序时观察到的一些行为有点好奇——似乎所有native函数消息/响应都是在JavaSystem.out.print之后打印的。这是因为native调用是在Java调用之后执行的,还是我应该忽略此行为?publicstaticvoidmain(String[]args){HelloWorldapp=newHelloWorld();System.out.println("say");app.print()

java - JNI 直接缓冲区。谁负责 native 缓冲区释放?

一方面,假设我们有一个使用env->NewDirectByteBuffer()创建的直接字节缓冲区。另一方面,我们有类似的直接缓冲区,但使用ByteBuffer.allocateDirect()创建。显然,这两个对象都应该由JVM以相同的方式管理,包括管理后备native缓冲区,在第一种情况下由用户提供,在第二种情况下由JVM从native堆中分配。当然,JVM必须在第二个对象的GC期间释放后备缓冲区(使用ByteBuffer.allocateDirect()实例化)。我的问题是:JVM会在第一个对象的GC期间尝试释放缓冲区(使用env->NewDirectByteBuffer()实例

java - 使用 JNI 通过 std::ostream 从 C++ 获取文本数据到 Java

我有一个C++类,它采用std::ostream作为参数,以便连续输出文本(跟踪信息)。我需要尽可能高效地将此文本传送到Java端。最好的方法是什么?我正在考虑使用直接缓冲区,但另一种方法是将所有函数调用转移到Java并在那里进行所有处理,但似乎我需要大量的JNI调用。如果可以显示确切实现方法的示例,那将非常有帮助,或者如果已经存在一些代码可以执行此操作(可能是另一个项目的一部分)。另一个帮助是将它直接连接到标准的Java流构造,这样整个实现对开发人员来说是完全透明的。(编辑:我找到了SharingoutputstreamsthroughaJNIinterface,这似乎是重复的,但并

java - 如果我使用 JNI 从 C 的多个线程调用 java 函数会怎样?

此链接似乎表明“它只是有效”:(在7.3附加native线程下的底部相当远)http://java.sun.com/docs/books/jni/html/invoke.html我不明白这怎么可能,嵌入式JVM会自动启动自己的线程吗?或者排队JNI调用?否则怎么可能多次调用同一个虚拟机。我没有指示执行任何线程?我能想到的任何工作方式是,如果java代码将简单地在与c代码相同的调用线程中执行。那是对的吗?这意味着我不必在Java中执行任何线程。 最佳答案 jvm不必创建自己的线程,方法调用在创建它们的native线程上执行。Attac

java 。 JNI。 jvm.dll

我有VisualStudioC++项目,它必须调用一些java功能。我打算使用JNI。我已经指定了额外的包含目录:C:\ProgramFiles(x86)\Java\jdk1.7.0_10\includeC:\ProgramFiles(x86)\Java\jdk1.7.0_10\include\win32和额外的库目录C:\ProgramFiles(x86)\Java\jdk1.7.0_10\lib并且能够编译所需的代码。但由于下一个错误,我仍然无法运行它:程序无法启动,因为缺少jvm.dll...我想,最简单的方法就是将dll复制到项目目录中。但我不知道是哪一个。例如,我发现其中有几

java - 最近的 Ubuntu 16.04 中的 JNI_CreateJavaVM() 堆栈损坏

几周以来,SWI-PrologJava接口(interface)在JNI_CreateJavaVM中立即崩溃。好吧,在大多数机器上。它在我的一台机器上运行良好,它运行相同版本的Ubuntu和openjdk...我将其简化为这个小程序:#include#include#includestaticJavaVM*jvm;intmain(intargc,char**argv){JavaVMInitArgsvm_args={0};JNIEnv*env;JavaVMOptionopt[8]={0};intoptn=0;intr;opt[optn++].optionString="-Djava.cl

java - 我可以在 Java Applet 中使用 JNI 吗?

Applets可以使用JNI(JavaNativeInterface)吗,有没有人试过? 最佳答案 您可以从小程序使用JNI,请记住小程序在客户端上运行,因此JNI将访问客户端以获取“NI”部分。 关于java-我可以在JavaApplet中使用JNI吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4366382/

java - 在 Java 7 上运行带有 JNI 的 Java 5/6 会给出堆栈防护警告

使用1.5(或打开1.5比较模式的1.6)构建的java程序给出此警告:JavaHotSpot(TM)ServerVMwarning:Youhaveloadedlibrarymynativelib.sowhichmighthavedisabledstackguard.TheVMwilltrytofixthestackguardnow.It'shighlyrecommendedthatyoufixthelibrarywith'execstack-c',orlinkitwith'-znoexecstack'.它似乎不会造成问题,但显然对我们的客户来说看起来有点可怕。我不认为在7中构建Jav

java - JNI GetMethodID 不适用于内部类的构造函数

我有一个带有私有(private)子类的类。我想在JNI包装器中创建该子类的实例并将其返回。我用谷歌搜索并试图让它工作但没有成功(methodID为空)。有什么建议吗?JNIEXPORTjobjectJNICALLJava_some_Class_some_Jni_Method(JNIEnv*env,jobjectthis){jclasscls=(*env)->FindClass(env,"someClass$someSubclass");if(cls==NULL)printf("jclasserror.");jmethodIDmethodID=(*env)->GetMethodID(e