Articles of jni

Android的JNI,如何用soname libxx.so.1.2.3加载库

需要从第三方使用Android的共享库,lib的soname和文件名是相同的,格式为libxx.so.1.2.3,这是linux上常见的。 我将lib文件重命名为libxx.so,并使用ndk-build将libxx.so链接到libmyjni.so中。 在我的java代码中,在调用libmyjni.so中的函数之前,我像这样加载它们: System.load("/data/local/tmp/libxx.so.1.2.3"); System.loadLibrary("myjni"); 我必须手动将libxx.so.1.2.3复制到/ data / local / tmp /。 这种方式很好用,上面的加载之后,我可以调用libmyjni.so中的函数。 在代码“System.loadLibrary(”myjni“);”中,系统总是试图从某处获取libxx.so.1.2.3。 我想知道,在现实世界中,如何在安装过程中将libxx.so.1.2.3复制到android设备上的特定位置? 这样我就可以System.load()了。 或android有官方的方式来安装自制lib到/ system / lib /? 如果libxx.so.1.2.3的格式为libxx.so,那么我可以使用System.loadLibrary(“xx”)加载它。

Bash脚本创build符号链接到共享库

我认为这个问题对于你的shell脚本怪物是相当容易的。 我正在寻找最优雅和最简单的方式来创build符号链接到Unix的共享库通过bash shell脚本。 我需要的是从“libmythings.so.1.1,libotherthings.so.5.11”等共享库文件列表开始,获取创build的符号链接,例如: libmythings.so -> libmythings.so.1 -> libmythings.so.1.1 libotherthings.so -> libotherthings.so.5 -> libotherthings.so.5.11 库文件位于包含其他文件(如其他shell脚本)的目录中。 编辑 :好,“ldconfig -nN”。 可以正常工作,但是我还需要链接,没有在“.so”之后附加的库的主要编号,至less有一个库,因为一个或多个库是来自Java的JNI调用的入口点,所以当一个库通过System.loadlibrary(“libraryname”)的方式实例化,它期望一个名为“libraryname.so”的库,而不是“libraryname.so.X”。 只有ldconfig -nN的解决scheme可以工作,如果有Java部分的解决方法。

适用于Linux Java Swing应用程序的Kiosk模式

如何禁用[Ubuntu] Linux机器上的操作系统级键盘快捷键(例如Alt-Tab,Ctrl-Alt-Left / Right等)? 我正在开发一个全屏的Java Swing应用程序,并且不希望用户能够任意切换程序。 切换“永远在上”标志是不够的, 用户不得被允许切换工作区,迁移焦点或任何其他类似的东西。 在执行应用程序之前和之后,机器必须正常工作。 谷歌说,这将需要JNI或JNA,但我正在寻找更多的手持。

Linux上的JDK 1.8缺lessJNI包含文件

我正在编译下面的项目: https://github.com/entropia/libsocket-can-java 我总是得到这个错误信息? 有谁知道如何解决这个问题,是否可能是Linux上的JDK 1.8.0.11(x64 Debian Wheezy)中的错误? In file included from jni/de_entropia_can_CanSocket.h:2:0, from jni/cansocket.cpp:23: /opt/jdk1.8.0_11/include/jni.h:45:20: fatal error: jni_md.h: No such file or directory #include "jni_md.h" ^

Linux上的JNI问题:无法打开共享对象文件

我已经在这里看到了这个问题,尝试了所提出的修复,但迄今为止还没有成功。 我有一些Java的经验,但JNI很久以前,从来没有在Linux上做过,但… 我试图得到一个简单的HelloWorld JNI应用程序在Linux上运行。 小java文件: class HelloWorld { private native void print(); public static void main(String[] args){ new HelloWorld().print(); } static { System.out.println(System.getProperty("java.library.path")); System.loadLibrary("HelloWorld"); } } 小C文件: #include <jni.h> #include <stdio.h> #include "HelloWorld.h" JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj) { printf("Hello World!\n"); return; } 通过以下方式编译C文件: gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/gcc/x86_64-redhat-linux/3.4.3/include/ -o libHelloWorld.so 运行应用程序: […]

使用java.library.path和LD_LIBRARY_PATH之间的区别

使用jvm参数有没有区别? -Djava.library.path=/path 在jvm开始 并设置Linuxpathvariables export LD_LIBRARY_PATH=/path 在JVM开始之前。 这两种select有什么优点/缺点?

如何在Linux上使用GDBdebuggingJava -JNI?

任何人都可以指导如何使用GDBdebugging器在Linux上debuggingJNI代码(如果可能的话,请build议其他选项)。 -My JNI project when running on Linux is leading to a JVM crash. -The CPP code has been compiled into .so files. -I run the project like this : *java xyz.jar -commandline_args_to_project*. 我已经安装了Gdb,但没有得到我们如何使用它来debugging项目。 我也一定需要用-g选项编译.cpp文件tdebugging.so文件?

当我从本地Java方法抛出C ++exception时会发生什么?

假设我将Sun的JVMembedded到C ++应用程序中。 通过JNI,我调用一个Java方法(我自己的),它依次调用我在共享库中实现的本地方法。 如果这个本地方法抛出一个C ++exception,会发生什么? 编辑:编译器是gcc 3.4.x,jvm是sun的1.6.20。

从ShellExecute获取PID

我从ShellExecuteEx启动一个进程,我真的需要得到ProcessID(这是这个类的要求的一部分)。 不知何故,所有重要的SHELLEXECUTEINFO返回null。 所以例如,如果我使用这个代码: exInfo.lpVerb = "open"; exInfo.lpFile = "C:\\Windows\\system32\\cmd.exe"; exInfo.nShow = 5; ShellExecuteExA(exInfo); 它启动了CMD.exe。 但现在我需要得到它的PID。 exInfo.hwnd返回0 , exInfo.hProcess返回null 。 这是正常的行为? 我不想诉诸使用CreateProcess(),因为我的函数也应该能够启动文件,如“C:\ doc1.docx”。 这只是一个方法,我不能预测将要发射什么(所以我不能预先知道窗口标题/类名,从那里得到hWnd,然后得到PID)。 有人能指出我的错误吗? 谢谢。

如何在Windows中使用Java快速截取桌面(ffmpeg等)?

我想用java来使用FFMPEG或其他解决scheme来截取我的机器的截图。 我知道Linux与没有JNI的ffmpeg工作,但在Windows上运行它不工作,可能需要(JNI?)有什么样的一些简单的Java类(和其他任何必要的)来捕获在Windows环境中可运行的屏幕截图? 是否有一些替代FFMPEG? 我想以比Java Robot API更快的速度截图,我发现它在截图中工作,但速度比我想要的要慢。 我知道在Linux中这工作得非常快: import com.googlecode.javacv.*; public class ScreenGrabber { public static void main(String[] args) throws Exception { int x = 0, y = 0, w = 1024, h = 768; FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(":0.0+" + x + "," + y); grabber.setFormat("x11grab"); grabber.setImageWidth(w); grabber.setImageHeight(h); grabber.start(); CanvasFrame frame = new CanvasFrame("Screen Capture"); […]