Tag: jni

在Activity中调用两次第三方库的本机方法会导致Android应用程序closures

我已经在我的应用程序中集成了两个本地库(.so)。 库编译得很好,我也可以在我的应用程序中加载它们。 我第一次调用库的本地方法,它工作正常,但如果我再次在Activity中调用相同的方法,应用程序closures。 我面临的问题与此处提到的完全相同: http://grokbase.com/t/gg/android-ndk/1226m68ydm/app-exit-on-second-native-call 解决scheme的作用是在另一个Activity中调用本地方法,并通过System.exit(0)强制closures它。 下面的文章我试图设置成功的操作后调用方法的NULL指针,但这也没有帮助我。 一旦它被System.loadLibrary()加载,它也不可能卸载一个库。 我想多次调用本地方法而不创build一个新的活动。 任何想法如何解决这个问题? (我最终find了一个解决scheme…在这里) 好的,我终于find了解决这个问题的方法。 解决scheme其实很简单。 构build另一个独立的本地库(实用程序库)来加载和卸载其他库。 我们需要做的是在实用程序的本地方法中使用dlopen()和dlclose()。 我们可以像以前一样通过System.loadLibrary()来加载实用程序库。 所以在实用程序库的本地方法中,我们需要做的是: 使用#include <dlfcn.h> //这是调用dlopen()和dlclose()函数所必需的。 提供处理程序和函数原型: void *handle; typedef int (*func)(int); // define function prototype func myFunctionName; // some name for the function 通过dlopen()打开库: handle = dlopen("/data/data/my.package.com/lib/somelibrary.so", RTLD_LAZY); 获取并调用库的function: myFunctionName = (func)dlsym(handle, "actualFunctionNameInLibrary"); myFunctionName(1); // passing parameters if needed in […]

在Java Swing中,如何获得Win32窗口句柄(hwnd)引用到窗口?

在Java 1.4中,你可以使用((SunToolkit)Toolkit.getDefaultToolkit())。getNativeWindowHandleFromComponent(),但是被删除了。 它看起来像你现在必须使用JNI来做到这一点。 你有JNI代码和示例Java代码来做到这一点? 我需要这个来调用Win32的GetWindowLong和SetWindowLong API调用,这可以通过Jawin库来完成。 我想要非常精确的东西,所以我可以传递一个对JDialog或JFrame的引用,并获得窗口句柄。 使用JNI摆动透明度可能是相关的。

使用Mavenpipe理DLL依赖关系

我有一个Java程序与Mavenpipe理其依赖关系。 其中一个依赖是另一个程序的JNI包装。 Maven负责对相关JAR文件的引用,但是我自己把这个DLL文件搞乱了。 有一个让Maven处理DLL的好方法吗? 理想情况下,我想将DLL加载到我们的本地存储库,如JAR文件。

从Java调用C#代码?

有没有人有一个很好的解决scheme,将一些C#代码集成到一个Java应用程序? 代码很小,所以我可以用java重新编写代码,但如果可能的话,我宁愿重新使用代码。 不要重复自己,等等 另外,我知道我可以将C#作为一个Web服务或任何其他的东西公开,但是它里面有一些安全/encryption的东西,所以如果可能的话,我宁愿保持它的紧密集成。 编辑:它将在一个基于服务器的应用程序,所以“下载”另一个运行时是无关紧要的。

Jni教程for android

嗨,任何人都可以build议我一些很好的资源来学习JNI为Android和一些很好的JNI教程?

.dll已经加载到另一个类加载器中了?

我有一个在Tomcat 3.2.1下运行的Web应用程序,需要进行JNI调用才能访问传统C ++代码中的数据和方法。 在webapp启动时加载一个servlet,作为init方法的一部分,它使得一个特定于该webapp实例的数据集被加载到C ++数据结构中。 这个servlet的Java代码包含以下内容: static { try { System.loadLibrary("JCoreImpl"); System.out.println("JCoreImpl loaded"); m_bLibraryLoaded = true; } catch (UnsatisfiedLinkError e) { m_bLibraryLoaded = false; System.out.println("JCoreImpl NOT loaded " + e); } } 事情工作正常,如果只有一个Web应用程序(我们称之为“webapps / aaa”)。 如果除了C ++数据结构中使用的数据集之外,还有另一个与webapps / aaa相同的webapp(“webapps / bbb”),那么webapps / aaa启动就好了,但是当webapps / bbb启动时,一个错误,指出: JCoreImpl NOT loaded java.lang.UnsatisfiedLinkError: Native Library E:\WebStation\binDebug\JCoreImpl.dll already loaded in […]

使用JNI和NDK旋转位图

背景: 我已经决定,由于位图占用大量内存,容易造成内存不足的错误,所以我将在C / C ++代码上花费大量的内存。 我用来旋转位图的步骤是: 读取位图信息(宽度,高度) 将位图像素存储到数组中。 回收位图。 创build一个相反大小的新位图。 把像素放入新的位图。 释放像素并返回位图。 问题: 即使一切似乎运行没有任何错误,输出图像不是原始的旋转。 事实上,它完全毁了它。 旋转应该是逆时针方向,90度。 示例(截图放大)我得到: 所以,正如你所看到的,不仅颜色变得诡异,而且尺寸与我所设定的不符。 这里真的很奇怪 也许我不读/正确地把数据? 当然这只是一个例子。 只要设备有足够的内存来保存它,代码就可以在任何位图上正常工作。 另外,我可能想对位图执行其他操作,而不是旋转它。 我创build的代码: Android.mk文件: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := JniTest LOCAL_SRC_FILES := JniTest.cpp LOCAL_LDLIBS := -llog LOCAL_LDFLAGS += -ljnigraphics include $(BUILD_SHARED_LIBRARY) APP_OPTIM := debug LOCAL_CFLAGS := -g cpp文件: #include <jni.h> #include […]

通过JNI传递C和Java之间的指针

目前,我正在尝试创build一个使用CUDAfunction的Java应用程序。 CUDA和Java之间的连接工作正常,但我有另一个问题,并想问,如果我的想法是正确的。 当我从Java调用本地函数时,我将一些数据传递给它,函数计算一些东西并返回结果。 是否有可能,让第一个函数返回一个引用(指针)这个结果,我可以传递给JNI并调用另一个函数,进一步计算结果? 我的想法是通过将数据保留在GPU内存中,并将参考传递给GPU,从而减less将数据复制到GPU以及从GPU复制数据的开销,以便其他function可以使用它。 尝试一段时间后,我想我自己,这应该是不可能的,因为应用程序结束后(在这种情况下,当C函数终止)指针被删除。 它是否正确? 或者我只是在C坏了看到解决scheme? 编辑:好,扩大一点问题(或者更清楚地说):当函数结束时,由JNI原生函数分配的内存是否被释放? 或者我仍然可以访问它,直到JNI应用程序结束或当我手动释放它? 感谢您的input :)

如何获取asynchronous调用的JNI接口指针(JNIEnv *)

我已经了解到,JNI接口指针(JNIEnv *)只在当前线程中有效。 假设我在本地方法中启动了一个新线程; 如何将事件asynchronous发送到Java方法? 由于这个新线程不能有(JNIEnv *)的引用。 (JNIEnv *)的全局variables显然不起作用?

如何将位图caching到本机内存

对于我的10,000点,我已经决定与这个酷酷的网站相提并论:一种机制来caching本地内存上的位图。 背景 Android设备的每个应用程序的内存数量非常有限 – 堆栈范围从16MB到128MB,具体取决于各种参数 。 如果你通过这个限制,你会得到OOM,这在使用位图的时候会发生很多次。 很多时候,一个应用程序可能需要克服这些限制,在庞大的位图上执行繁重的操作,或者只是将它们存储起来供以后使用,而且您需要 我想到的是一个简单的java类,它可以使事情变得更容易。 它使用JNI来存储位图数据,并能够在需要时进行恢复。 为了支持这个类的多个实例,我不得不使用我发现的一个技巧( 这里 )。 重要笔记 数据仍然存储在RAM中,所以如果设备没有足够的RAM,应用程序可能会被终止。 请记住尽快释放内存。 这不仅是为了避免内存泄漏,而且也是为了避免系统优先被杀死,一旦你的应用程序进入后台。 如果不想忘记释放内存,则可以在每次还原位图时释放它,或者使类实现可closures 。 作为一个安全措施,我已经使它在finalize()方法中自动释放它的本地内存,但是不要让它对这个工作负责。 这太危险了。 当这种事情发生的时候,我也把它写入日志。 它的工作方式是将整个数据复制到JNI对象中,为了恢复,它从头开始创build位图并将数据放入其中。 正在使用和恢复的位图是ARGB_8888格式。 当然,你可以改变它到任何你想要的,只是不要忘记改变代码… 大的位图可能需要一些时间来存储和恢复,所以在后台线程上执行它可能是明智的。 这不是一个完整的OOM解决scheme,但它可以帮助。 例如,您可以将其与您自己的LruCache一起使用,同时避免将caching本身用于堆内存。 代码仅用于存储和恢复。 如果你需要执行一些操作,你将需要进行一些研究。 openCV可能是答案,但如果你想执行一些基本的东西,你可以自己实现它们( 这里是一个使用JNI旋转大图片的例子 )。 如果你知道其他的select,请在这里告诉我。 希望这对一些人有用。 请写下您的意见。 另外,如果您发现代码有任何问题或意见不清,请告诉我。 解决scheme更好 如果你想在JNI方面执行更多的操作,你可以使用我所做的这篇文章 。 它基于我在这里编写的代码,但允许您执行更多操作,并且可以轻松添加更多自己的代码。