Questions tagged «java-native-interface»

Java本机接口(JNI)既使JVM实现能够运行系统本机代码,又使本机代码能够运行Java代码(通过创建新的JVM实例)。JNI的最常见目标语言是C和C ++,至少Sun / Oracle JDK实现为其提供了帮助程序命令(javap-用于代码反汇编,javah用于c代码生成)。

7
有任何简单的登录Android NDK代码的方法吗?
我正在寻找一种使用Eclipse在Android NDK应用程序中轻松调试C代码的方法。我已经阅读了使用gdb或类似工具调试应用程序的方法,但是我想要的是以某种方式将消息推送到Eclipse的方法。 我正在寻找一种简单的解决方案,就像在C语言中使用打印功能并在DDMS日志或类似工具中看到它一样。有没有人有这样做的经验?

6
Android Studio中的JNI和Gradle
我正在尝试将本机代码添加到我的应用中。我拥有../main/jni了Eclipse项目中的所有内容。我已添加ndk.dir=...到local.properties。我还没有做其他任何事情(我不确定实际上还需要什么,所以如果我错过了什么,请告诉我)。当我尝试构建时,出现以下错误: Execution failed for task ':app:compileDebugNdk'. > com.android.ide.common.internal.LoggedErrorException: Failed to run command: /Users/me/android-ndk-r8e/ndk-build NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=/Users/me/Project/app/build/ndk/debug/Android.mk APP_PLATFORM=android-19 NDK_OUT=/Users/me/Project/app/build/ndk/debug/obj NDK_LIBS_OUT=/Users/me/Project/app/build/ndk/debug/lib APP_ABI=all Error Code: 2 Output: make: *** No rule to make target `/Users/me/Project/webapp/build/ndk/debug//Users/me/Project/app/src/main/jni/jni_part.cpp', needed by `/Users/me/Project/app/build/ndk/debug/obj/local/armeabi-v7a/objs/webapp//Users/me/Project/app/src/main/jni/jni_part.o'. Stop. 我需要做什么? Android.mk: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # OpenCV OPENCV_CAMERA_MODULES:=on OPENCV_INSTALL_MODULES:=on include .../OpenCV-2.4.5-android-sdk/sdk/native/jni/OpenCV.mk LOCAL_MODULE …


11
如何使jni.h被找到?
在Ubuntu 12.04中,我安装了来自sun / oracle的jdk7。当时locate jni.h,它将打印多个位置 /usr/lib/jvm/java-6-openjdk-amd64/include/jni.h /usr/lib/jvm/jdk1.7.0_07/include/jni.h ... 在JDK生成的头文件中,存在include <jni.h>,并且当前它抱怨 fatal error: jni.h: No such file or directory. 在my中Makefile,没有指定位置的说明jni.h。我在问是否可以配置某些系统参数以使jni.h(例如/usr/lib/jvm/jdk1.7.0_07/include/jni.h)的路径在编译时已知。

1
如果GetStringUTFChars返回了副本,您应该调用ReleaseStringUTFChars吗?
Rob Gordon撰写的《 Essential JNI:Java本机接口》一书包含以下代码示例,可将jstring转换为C字符串: const char* utf_string; jboolean isCopy; utf_string = env->GetStringUTFChars(str, &isCopy); /* ... use string ... */ if (isCopy == JNI_TRUE) { env->ReleaseStringUTFChars(str, utf_string); } 请注意,它仅ReleaseStringUTFChars在isCopy为true时调用。 但是《Java本机接口:程序员指南和规范》一书(替代链接http://192.9.162.55/docs/books/jni/html/objtypes.html#5161:)说: 无论GetStringChars已将* isCopy设置为JNI_TRUE还是JNI_FALSE,都必须使用ReleaseString-Chars调用。ReleaseStringChars释放副本或取消固定实例,具体取决于GetStringChars是否返回了副本。 我以为这是戈登书中的错误是正确的吗?


7
通过JNI在C和Java之间传递指针
目前,我正在尝试创建一个使用CUDA功能的Java应用程序。CUDA与Java之间的连接工作正常,但是我还有另一个问题,想问一下我对此是否正确。 当我从Java调用本机函数时,我将一些数据传递给它,这些函数计算出一些东西并返回结果。是否可以让第一个函数返回对此结果的引用(指针),我可以将其传递给JNI并调用另一个对结果进行进一步计算的函数? 我的想法是通过将数据保留在GPU内存中并仅将引用传递给它,以便其他功能可以使用它,从而减少往返于GPU的数据复制所带来的开销。 经过一段时间的尝试,我自己想,这是不可能的,因为在应用程序结束后(在这种情况下,当C函数终止时)指针被删除。这个对吗?还是我对C语言很不好而看不到解决方案? 编辑:好吧,将问题扩大一点(或更清楚地说):函数结束时是否由JNI本机函数分配的内存被释放了?或者在JNI应用程序结束或手动释放它之前,我是否仍可以访问它? 感谢您的输入 :)

4
如何在JNI中将C结构来回传递给Java代码?
我有一些通过JNI调用的C函数,这些函数带有指向结构的指针,还有一些其他函数将分配/释放指向相同类型结构的指针,因此处理包装程序要容易一些。令人惊讶的是,JNI文档很少介绍如何处理C结构。 我的C头文件如下所示: typedef struct _MyStruct { float member; } MyStruct; MyStruct* createNewMyStruct(); void processData(int *data, int numObjects, MyStruct *arguments); 相应的JNI C包装文件包含: JNIEXPORT jobject JNICALL Java_com_myorg_MyJavaClass_createNewMyStruct(JNIEnv *env, jobject this) { return createNewMyStruct(); } JNIEXPORT void JNICALL Java_com_myorg_MyJavaClass_processData(JNIEnv *env, jobject this, jintArray data, jint numObjects, jobject arguments) { int *actualData = (*env)->GetIntArrayElements(env, …

4
Windows上的多线程Java应用程序的CPU使用率太低
我正在开发一个Java应用程序,用于解决一类数值优化问题-更确切地说是大规模线性编程问题。单个问题可以分解为多个较小的子问题,这些子问题可以并行解决。由于子问题多于CPU内核,因此我使用ExecutorService并将每个子问题定义为可提交给ExecutorService的Callable。解决子问题需要调用本机库-在这种情况下为线性编程求解器。 问题 我可以在Unix和具有多达44个物理核心和256g内存的Windows系统上运行该应用程序,但是在Windows上,大问题的计算时间比Linux上高一个数量级。Windows不仅需要大量内存,而且随着时间的推移,CPU利用率从开始时的25%下降到几个小时后的5%。这是Windows中任务管理器的屏幕截图: 观察结果 整个问题的大型实例的解决时间从数小时到数天不等,并且最多消耗32g的内存(在Unix上)。子问题的解决时间在ms范围内。 对于仅需几分钟即可解决的小问题,我不会遇到此问题。 Linux开箱即用地使用了两个套接字,而Windows要求我显式地激活BIOS中的内存交错,以便应用程序利用两个内核。但是,是否执行此操作不会对总体CPU利用率随时间的下降造成影响。 当我查看VisualVM中的线程时,所有池线程都在运行,没有一个正在等待。 根据VisualVM,90%的CPU时间花在了本机函数调用上(解决了一个小的线性程序) 垃圾回收不是问题,因为该应用程序不会创建和取消引用很多对象。而且,大多数内存似乎是堆外分配的。对于最大实例,Linux上4g的堆就足够了,而Windows上8g的堆就足够了。 我尝试过的 各种JVM arg,高XMS,高元空间,UseNUMA标志和其他GC。 不同的JVM(热点8、9、10、11)。 不同线性编程求解器(CLP,Xpress,Cplex,Gurobi)的不同本机库。 问题 是什么导致大量使用本地调用的大型多线程Java应用程序在Linux和Windows之间的性能差异? 在实现方面有什么可以改变的,例如Windows,我是否应该避免使用接收数千个Callable的ExecutorService来代替呢?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.