我在java中创建了一个整数数组,并通过jni将数组传递给cpp程序我的代码是:importjava.util.*;classSendArray{//Nativemethoddeclarationnativeint[]loadFile(int[]name);//Loadthelibrarystatic{System.loadLibrary("nativelib");}publicstaticvoidmain(Stringargs[]){intarr[]={1,2,3,4,5,6,7,8,9,10};//CreateclassinstanceSendArraymappedFile=new
我找到了大量关于如何在JNI中生成二维基元数组并将其返回给Java的文档。但是这些信息无法描述如何在C中给定上下文传递一个已经存在的2Dfloat组(float**)。为了明确描述我的问题,我将添加一些我想要实现的C伪代码://Returnsa2DfloatarrayfromCtoJavajfloatArrayndk_test_getMy2DArray(JNIEnv*env,jobjectthiz,jlongcontext){//CastmycontextreferenceMyContextRefcontextRef=(MyContextRef)context;//Incasewene
我正在使用Tomcat,在停止我的Web应用程序后,仍然存在对我的Web应用程序的类加载器实例的引用。结果是大量内存(主要与静态数据相关)不会被释放。这迟早会导致OutOfMemoryError。我做了一个heapdump,然后我意识到它由一个JNIglobalreference持有防止类加载器将是garbagecollected.我的应用程序不使用JNI。我也没有使用ApacheTomcatNativeLibrary。我正在使用Sun/OracleJDK。我想追查这个全局引用的原因/来源。(我的猜测是JVM内部引用了类加载器-但为什么/在哪里?)。问题:有哪些方法/工具集可以实现这一
是否有独立于平台的Java语句从不同于Java源代码所在的目录加载native库?我想使用这样的东西:publicclassHelloWorld{static{System.loadLibrary("../some_project/HelloWorld");}publicstaticnativevoidprint();}问题是System.loadLibrary()不支持路径名参数中的目录分隔符。另外,不幸的是,System.load()需要一个绝对路径名,这不仅意味着我不能像上面那样指定一个相对目录(我想这样做),而且还需要参数包含,例如,前面的Linux系统上JNI库名称的“lib
我正在尝试安装Eclipse。为了安装,我已经完成了以下操作。在C:\ProgramFiles(x86)\Java\JDK1.7.0_15安装JDK7u1564位(实际下载名称:jdk-7u15-windows-i586.exe)我在管理员中运行cmd并键入“C:\Users\Alfred>java-version”,这给了我“Java版本“1.7.0_15”java(TM)SE运行时环境(build1.7.0_15-b03)JavaHotspot(TM)ClientVM(build23.7-b01,混合模式,共享)在同一个cmd窗口中,我输入了“C:\Users\Alfred>j
我有一个C++代码,在执行时:加载JVM(我完全控制如何加载JVM),并使用CJNI代码调用Java方法(从加载的类)。Java代码没有Main(),它实际上不是标准的Java应用程序。主要是编译压缩成Jar文件的静态代码,由C++模块调用。是否可以分析由YourKit执行的Java代码(有许可证)?如果是这样,我会很高兴知道如何做。 最佳答案 我会把它丢给希望分析Java的C++人员:Java有一个很棒的可视化分析器,它可以自动连接到称为VisualVM的JVM。它包含在jdk中。在这里查看:http://visualvm.jav
我有一个包含遗留C代码的dll,我通过JNI调用这个dll,但有时C代码崩溃并导致JVM终止。有没有办法避免JVM崩溃?我可以处理JNI故障并让JVM存活吗?:) 最佳答案 正如Timo所说,您别无选择,只能使JNI代码健壮。如果您不能这样做(例如,如果您没有源代码),那么也许您可以寻求进程间解决方案。将JNI代码放在一个单独的服务器进程中,进行RMI或HTTP调用。如果它崩溃了,请重新启动“服务器”,但主JVM仍然存在。显然会有性能开销和复杂性增加,但也许您可以负担得起? 关于java
我的Android应用程序的C代码中有一个复杂的结构,我想在Java端使用它。我用谷歌和stackoverflow做了一些研究,所以我从我的C结构创建了java类,但现在如何在Java中获取它。我找到了这些信息,关于在类中创建指针并在C端使用它:GetthefieldID:(*env)->GetFieldID(...)Getthepointer:(*env)->GetLongField(...)Setthepointer:(*env)->SetLongField(...)但我不明白它到底是如何工作的......在上面,您可以找到我到目前为止所做的事情……没那么多!在C端:Complex
我正在使用JNI调用一个静态java方法,该方法又创建一个SwingJFrame并显示它。代码相当简单,Java代码独立运行(即javaStartAWT做它应该做的事),而当使用JNI从C调用时,进程挂起。我在MacOSX10.8MountainLion上使用JDK1.7.0_09。这是我用来调用静态方法的C代码:JavaVM*jvm;JNIEnv*env=create_vm(&jvm);jclassclass=(*env)->FindClass(env,"StartAWT");jmethodIDmethod=(*env)->GetStaticMethodID(env,class,"r
按照@tulskiy在这篇文章PassingpointersbetweenCandJavathroughJNI中的建议,我一直在通过JNI在Java中存储c指针。诀窍是将指针转换为jlong。所以从c我有return(jlong)ptr;我要返回一个jlong(总是64位),因为我希望我的代码在64位和32位系统上都能工作。64位计算机上64位指针在内存中的大小为64位,而在32位计算机上,指针在内存中的大小为32位。问题是在32位机器上我收到编译器警告“从不同大小的指针转换为整数”。如果我有,警告就会消失return(jlong)(int32_t)ptr;但是这段代码