Tag: jni

Java应用程序通过JNI调用C ++ DLL; 如何最好地分配内存?

问题的基本摘要是:如何最好地优化我的内存分配,以便为我通过JNI访问的DLL提供尽可能多的内存? 我应该尽量减少什么,我应该最大化什么,等等。 SYSTEM:在具有4 GB RAM的32位系统中将JBoss 6作为Windows 32服务运行。 我知道Java Heap的内存有最大限制。 JVM是JRE1.6.0_26 服务:安装在JBoss下的是一个webapp,它接收来自客户的请求; 每个请求通过JNI调用C ++构建的DLL来以某种方式处理图像文件。 问题:有时,对于较大或一些(并非所有)LZW压缩映像,调用java类会收到一条消息,指出DLL遇到全局内存耗尽并且无法完成请求的进程。 除了基本的Windows进程之外,服务器上没有其他活动正在运行。 当前的JBOSS App Server内存设置如下,但可能过多: -Xms1024m -Xmx1024m -Xss1024k -XX:MaxPermSize = 128m 我正在尝试确定最佳内存设置,以便为JNI DLL提供尽可能多的资源,因为我知道JNI不使用分配给Java堆的任何内存。 我已经读过这些,但是没有发现它们对我回答我的问题很有帮助: Java JNI:内存分配/分区 可以使用jconsole来识别JNI C ++对象中的内存泄漏吗? 目前提供的两个答案没有解决遗留问题。 一周后JBoss服务器的当前内存与JVM参数设置如上(TaskManager指示java.exe进程为750,672k) Total Memory Pools: 5 Pool: Code Cache (Non-heap memory) Peak Usage : init:2359296, used:7317312, committed:7438336, max:50331648 Current Usage : init:2359296, used:7306496, […]

在没有无限强度的JCE文件的情况下,AES256加密解密是否可行?

我正在开发的项目有一个需要AES加密和解密的部分。 从我可以查找的所有可能的互联网资源中,很难找到任何AES256加密的参考,而无需从Sun(现在的Oracle网站)下载和安装Unlimited Strength JCE文件。 除了分发相同的法律问题之外,在要求最终用户访问特定网站并下载某些文件,将它们放入目录然后将内容添加到类路径时,它实际上并没有帮助我们。在Windows等! 在互联网上有一些引用BountyCastle的轻量级API,可能不需要JCE文件,但我无法查找一个非常相关的参考或示例来certificate它。 不确定,但这是其他所有编程语言的问题吗? 如果没有安装了那些特定JCE文件的AES 256位加密,那么JNI方法可以帮助吗? 为了详细说明,AES 256加密可以在C / C ++中完成,然后我可以调用那些使用JNI获得所需结果吗? 打包软件(作为jar文件)会引起关注,还是会出现其他问题? 另一个重要的因素是该项目将同时运行Mac和Windows,因此可能是使用C / C ++(特定编译器/解释器版本或任何东西)的限制? 有没有不同的方法来处理这个? 还有其他方法吗?

使用JNI调用Java方法时,什么是“Method Signature”参数?

我想在Qt中使用JNI调用Android Java方法。 有一个奇怪的“方法签名”参数,我无法理解。 这是什么以及如何设置? 在例子中,它类似于(II)I或(I)I 。 这是什么意思? 例如: jint max = QAndroidJniObject::callStaticMethod(“java/lang/Math”, “max”, “(II)I”, a, b);

为什么我需要释放在JNI本机函数中创建的全局引用?

我有一个Java类,其中包含用C ++实现的本机函数,称为nz.ac.unitec.BigInteger 。 nz.ac.unitec.BigInteger本机实现很简单,只需包装java.math.BigInteger并调用其构造函数并add , subtract , multiply …函数。 mNativeContext中的字段mNativeContext用于存储对java.math.BigInteger对象的全局引用。 该对象有一个终结器,当对象被垃圾收集时应该销毁全局引用,所以我没有泄漏全局引用。 当我运行一个简单的测试循环来创建许多nz.ac.unitec.BigInteger对象而没有显式释放创建的对象时,JNI错误被报告为跟随日志(LOG1)。 但是如果我在离开测试函数之前显式释放创建的对象,则可以成功执行压力测试。 当我有一个终结器在对象被垃圾回收时删除它们时,为什么JVM会耗尽全局引用? LOG1: F/art (10730): art/runtime/indirect_reference_table.cc:113] JNI ERROR (app bug): global reference table overflow (max=51200) F/art (10730): art/runtime/indirect_reference_table.cc:113] global reference table dump: F/art (10730): art/runtime/indirect_reference_table.cc:113] Last 10 entries (of 51200): F/art (10730): art/runtime/indirect_reference_table.cc:113] 51199: 0x12e88790 java.math.BigInteger F/art (10730): art/runtime/indirect_reference_table.cc:113] 51198: 0x12e85490 java.math.BigInteger F/art […]

如何从JNI中的GetDirectBufferAddress调用多种数据类型?

我通过本机方法得到一个bytebuffer 。 bytebuffer以3 int开头,然后只包含双精度。 第三个int告诉我后面的双打数量。 我能够读到前三个int 。 当我尝试阅读双打时,为什么代码会崩溃? 获取前三个整数的相关代码: JNIEXPORT void JNICALL test(JNIEnv *env, jobject bytebuffer) { int * data = (int *)env->GetDirectBufferAddress(bytebuffer); } 获得剩余双打的相关代码: double * rest = (double *)env->GetDirectBufferAddress(bytebuffer + 12);

JNI,如何列出所有当前实例?

我想知道JNI apis是否可以在当前JVM中列出所有当前可用的实例(作为jobject)。 我的意思是: jvm->AttachCurrentThreadAsDaemon((void**)&env,0); jobject* instances; int count = env->GetInstances(&instances); 我的任务是在它们中搜索实现某个接口的对象( env->IsInstanceOf() ),我必须在没有类名的情况下动态地全局地执行此操作

如何将java函数指针传递给c ++本机代码

我想从java(android)代码调用本机c ++方法,并将java函数作为参数传递,因此我将能够将函数指针保存在c ++代码中,并从本机代码中激活它。 我选择使用匿名类在java中实现函数指针,我从java调用本机函数如下: interface FunctionPtrHelper { bool function(String param); } NativeFunc(param1,param2,new FunctionPtrHelper() { public bool myFunction(String param) { //body of my function }}); 如何让swig / jni知道第3个参数(实际上是一个类)并将其转换为c ++中的函数指针(包含’myFunction’)? 如果不可能,是否有另一种方法将函数指针从java传递给c ++?

JNI vs Runtime.exec()

我有两个选择 – 我可以使用JNI或使用Runtime.exec来执行C ++库。 C ++程序是CPU密集型并且长时间运行,即某些调用可能需要几个小时才能返回。 各自的优点和缺点是什么? 我应该选择哪种方法?

如何使用Java在屏幕上移动Windows窗口?

我一直在考虑使用GUI创建一个窗口管理器,可能是Java。 但是,我正在努力找出移动不属于我的程序的窗口的最佳方法。 到目前为止,似乎我应该使用JNI与Windows API进行交互,但我没有找到任何有用的示例。 有谁知道如何做到这一点? 谢谢! PS。 如果有更好的语言,我不一定与Java联系在一起。

如何在JNI中访问从C ++返回java.lang.String的Java方法的返回值?

我试图从一个从C ++调用的Java方法传回一个字符串。 我无法找出我应该调用什么JNI函数来访问该方法并返回一个jstring值。 我的代码如下: C ++部分 main() { jclass cls; jmethodID mid; jstring rv; /** … omitted code … */ cls = env->FindClass(“ClassifierWrapper”); mid = env->GetMethodID(cls, “getString”,”()Ljava/lang/String”); rv = env->CallStaticMethod(cls, mid, 0); const char *strReturn = env->GetStringUTFChars(env, rv, 0); env->ReleaseStringUTFChars(rv, strReturn); } Java代码 public class ClassifierWrapper { public String getString() { return “TEST”;} } 方法签名 […]