Articles of jni

在Linuxterminal编译项目不起作用

我有一个Compile.sh文件。 这个作品像一个魅力: cd src javac model/JNIResultSet.java javah -jni model.JNIResultSet cp model_JNIResultSet.h ./../bin/ cd .. cd bin gcc -fPIC -o libspieler.so -shared -I/usr/java/jdk1.8.0_73/include/ SharedTable.c -lc java -Djava.library.path=./../bin/ app.Main 我的问题是,我不想在我的源文件夹中。 我想让他们在一个单独的文件夹中。 为此,我的脚本看起来像这样: cd src javac model/JNIResultSet.java javah -jni model.JNIResultSet cp model_JNIResultSet.h ./../data/ cd .. cd data gcc -fPIC -o libspieler.so -shared -I/usr/java/jdk1.8.0_73/include/ SharedTable.c -lc cd .. cd […]

将.so文件转换为.jnilib文件

我有一个.so库,在ELF格式下编译用于Linux,正在被Java程序使用。 我试图将这个应用程序移植到Mac OS X,并发现OS X为这些文件使用不同的扩展名.jnilib 。 我已经想出了如何设置PATH以便正确find文件。 但是,OS X Java无法加载.so文件(因为它期望其他扩展名)。 如果将文件扩展名从.so更改为.jnilib ,则JVM可以find这些文件,但无法读取它们(因为它们编译不正确)。 有没有办法,无论是在Linux系统或在Mac OS X, 没有源代码 ,将这些.so文件转换为.jnilib ? 我怀疑这是不可能的,但堆栈溢出还没有让我失望 – 我不会把“这是不可能的”作为失败。

如何将XImage保存为位图?

我试图创build将捕获桌面video(帧)的JNI C ++库。 第一步是简单地做一个桌面的屏幕截图。 代码是: #include <iostream> #include <X11/Xlib.h> using namespace std; int main() { Display *display; int screen; Window root; display = XOpenDisplay(0); screen = DefaultScreen(display); root = RootWindow(display, screen); XImage *img = XGetImage(display,root,0,0,400,400,XAllPlanes(),ZPixmap); if (img != NULL) { //save image here } return 0; } 但是,如何将img保存为位图文件? 由于目标库是JNI – 它不能使用第三方库。 (据我所知)。 请帮忙。 谢谢。

针对GLIBCbuild立一个NDK库

我有兴趣构build一个开源项目,它需要GNU库GLIBC和GLIBM。 如果我要在Linux下(我使用Ubuntu 11.10作为主机)交叉编译共享(.so)甚至静态(.a)对象,使用ARMv7-a neon体系结构,使用API​​-9作为一个图书馆来调用Java的JNI,最终编译成一个APK的分布,将采取什么步骤来实现这一结果? 鉴于我已经尝试过Google NDK工具链(根据文档设置$ PATH和$ CC),各种自定义工具链, Code Sourcery工具链以及使用crosstool-ng在XDA论坛上build议的工具链是有可能实现一个可以从JNI调用的共享对象文件,并可以访问非根Android设备上的完整GLIBC库? 我已经search了一个这个答案,最近的我是在本地构buildGLIBC和GLIBM,并使用NDK的arm-linux-androideabi-ld手动复制相关对象(.o)文件和手动链接。 当使用Java的System.LoadLibarary()调用库时,Crosstool-ng和CodeSourcery中的libc.so.6文件不能工作,因为重定位失败(给出错误未知的reloctypes19)。 我的重定位知识不是最好的,但是从我读到的这个需要更改/linux/elf.h头文件,但我不确定从哪里去。 我相信从我已经读到,有可能做一个静态的可执行文件,当链接解决所有的依赖关系,但不能将它打包为一个APK文件,据我所知。 当然,我不可能是第一个想要针对Android平台上的仿生以外的东西编译C代码吗? 有很多C项目可以移植到Android上,显然GLIBC在iPhone上已经有了相当长的一段时间了。

麻烦编译JNI

我通过引用已经用JNI生成的头文件实现了以下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; } 当我尝试编译它(生成如此库)使用: cc -g -I/usr/lib/jvm/java-7-openjdk/include -I/usr/lib/jvm/java-7-openjdk/include/linux HelloWorld.c -o libHelloWorld.so 我得到这个错误: /usr/lib/gcc/i686-linux-gnu/4.6.1/../../../i386-linux-gnu/crt1.o: In function `_start': (.text+0x18): undefined reference to `main' collect2: ld returned 1 exit status 我该如何解决这个问题?

在eclipse中sudo身份validation之后,在加载JNI库时出错

我想访问设备,所以我已经在eclipse中开发了一个Java代码,使用JNI库调用与设备通信的c代码。 为了访问设备,我们需要在eclipse中进行sudo身份validation,所以我使用以下链接完成了身份validation 如何以Eclipse的超级用户身份运行我的应用程序? 但现在我正在加载Java代码中的JNI库的问题 我收到错误 WARNING: Running as root! Loading… Did not load library at java.lang.ClassLoader$NativeLibrary.load(Native Method) at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1750) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1675) at java.lang.Runtime.loadLibrary0(Runtime.java:840) at java.lang.System.loadLibrary(System.java:1047) at org.sc.ivb.jni.DeviceCommunicationController.<clinit>(DeviceCommunicationController.java:10) Exception in thread "main" java.lang.UnsatisfiedLinkError: org.sc.ivb.jni.DeviceCommunicationController.Ivb_InitDevice()V at org.sc.ivb.jni.DeviceCommunicationController.Ivb_InitDevice(Native Method) at org.sc.ivb.jni.DeviceCommunicationController.main(DeviceCommunicationController.java:27)

是否有可能在32个JVM上设置-Xmx为高可以缩小可用于JNI的空间,从而导致JNI失败?

我有一个问题,分配到很多-Xmx导致一个最不寻常的问题。 问题 :在64位Linux操作系统上的32位JVM上,将-Xmx设置为3072m,除了一个条件,即servlet试图通过JNI IPC与许多外部实体通信。 当我们将-Xmx降低到2048m时,它就可以工作。 在tomcat内没有错误是见过的。 唯一出现的错误是在JNI日志代码中。 这使我相信,因为这是一个32位的进程,所以将最大Java堆空间设置为3072m,为JNI C ++本机代码留下了很小的空间。 它不能为..线程分配足够的空间。 我已经调查过: 64位操作系统上的32位JVM的最大Java堆大小,这不是我所要求的。 问题 : 是否有可能在32 JVM上将-Xmx设置为高可以缩小可用于JNI的空间,使其失败? 我们如何确定一个给定的情况,JNI过程有什么可用的? 知道清单 : Linux 64位HCOS-130:〜#uname -a Linux HCOS-130 2.6.27.19-5-default#1 SMP 2009-02-28 04:40:21 +0100 x86_64 x86_64 x86_64 GNU / Linux java 6 32bit jre1.6.0_45 CATALINA_OPTS =“ – server -Xmx3072m -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath = $ CATALINA_HOME / logs” ps aux […]

如何正确使用RegisterNatives

我试图通过jni注册一个本地函数,为此,我必须在jninativemethod结构体中存储一个指向该函数的指针,该函数指针有一个void *字段。 在设置这个字段时,我得到错误的error: invalid conversion from void (*)(JNIEnv*, _jclass*, jlong, _jobject*)' to void*编译时使用unix上的GCC。 我环顾四周,似乎你不允许将函数指针转换为void指针,那么这个接口是否被破坏? 有没有一个“正确”的方法来做到这一点? (除了使用javah生成头文件和导出函数之外)

未定义的符号:在Linux中的JNI_CreateJavaVM

我有2个项目。 两者都是在Ubuntu 64位的Netbeans IDE中创build的。 首先,我的.so项目实现了从c ++代码调用Java函数。 和我的控制台应用程序尝试调用.so文件中的函数。 编译和运行时出现如下错误: /home/online0227/desktop/jvm run/dist/Debug/GNU-Linux-x86/jvm_run: symbol lookup error: ./libjvm_dll.so: undefined symbol: JNI_CreateJavaVM 如何解决这个问题? 我包括了我的.so项目的path。 这是我编译.so项目时,netbeans在其编译输出上显示的内容: g++ -c -g -I/home/online0227/jdk1.7.0_25_x64/include/linux -I/home/online0227/jdk1.7.0_25_x64/include -fPIC -MMD -MP -MF build/Debug/GNU-Linux-x86/_ext/1117207477/testlib.od -o build/Debug/GNU-Linux-x86/_ext/1117207477/testlib.o /home/online0227/desktop/jvm\ dll/testlib.cpp g++ -o dist/Debug/GNU-Linux-x86/libjvm_dll.so build/Debug/GNU-Linux-x86/_ext/1117207477/testlib.o -shared -fPIC 这个.so编译得很好,生成.so文件。 以下是我的Netbeans在编译我的主控制台应用程序时显示的内容: g++ -c -g -I/home/online0227/jdk1.7.0_25_x64/include/linux -I/home/online0227/jdk1.7.0_25_x64/include -MMD -MP -MF build/Debug/GNU-Linux-x86/main.od -o build/Debug/GNU-Linux-x86/main.o main.cpp g++ […]

android中无法parsingANDROID_LOG_DEBUG

我想以编程方式截图。 我已经采取了这个http://www.pocketmagic.net/?p=1473下面的类,但它不采取截图。 当我尝试使用debugging代码时debugging代码 __android_log_print(ANDROID_LOG_DEBUG,DEBUG_TAG,"messsage"); 它不承认ANDROID_LOG_DEBUG给我这个符号的错误'ANDROID_LOG_DEBUG'无法解决,而是我已经包括android / log.h 请帮助解决这个问题。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <sys/types.h> #include <time.h> #include <linux/fb.h> #include <linux/kd.h> #include <jni.h> #include "pixelflinger.h" #include<sys/syscall.h> #include<sys/stat.h> #include <string.h> #include <android/log.h> typedef struct { long filesize; char reserved[2]; long headersize; long infoSize; long width; long depth; short biPlanes; […]