Tag: jni

通过JNI将float 传递给C ++的最简单方法

在我的Java代码中,我有一个2D浮点数组float[x][4] floatArray 。 这里x可以在1到25之间。我必须通过JNI将这个2D float数组传递给C++方法。 我的JNI方法是 jboolean MyJNIMethod(JNIEnv * env, jobject obj, jobjectArray myArray) { //how to convert this myArray to something that can be safely passed to C++ method below } 在MyJNIMethod我必须调用C++方法并将从Java获取的2D float数组传递给此方法 bool MyCplusPlusMethod(float coordinates[][4]) { } 由于缺乏原生开发知识,我很难将jobject正确地转换为float [] []。 有人能告诉我最简单,最安全的方法吗? 谢谢

Java:InputStream读取大文件太慢了

我必须按字符读取53 MB的文件。 当我使用ifstream在C ++中完成它时,它在几毫秒内完成,但使用Java InputStream需要几分钟。 Java很慢或者我错过了什么是正常的吗? 另外,我需要用Java完成程序(它使用servlet,我必须从中调用处理这些字符的函数)。 我想也许用C或C ++编写文件处理部分,然后使用Java Native Interface将这些函数与我的Java程序连接……这个想法怎么样? 任何人都可以给我任何其他提示……我真的需要更快地阅读文件。 我尝试使用缓冲输入,但它仍然没有提供甚至接近C ++的性能。 编辑:我的代码跨越了几个文件,它非常脏,所以我给出了概要 import java.io.*; public class tmp { public static void main(String args[]) { try{ InputStream file = new BufferedInputStream(new FileInputStream(“1.2.fasta”)); char ch; while(file.available()!=0) { ch = (char)file.read(); /* Do processing */ } System.out.println(“DONE”); file.close(); }catch(Exception e){} } }

防止Java多次加载库

我有几个使用相同JNI库的类,称为“jni”。 在每个类中,我在类的静态初始化程序中调用了System.loadLibrary(): Class class1 { static{ System.loadLibrary(“jni”); } … } Class class2 { static{ System.loadLibrary(“jni”); } … } 唯一的问题是,我只想调用System.loadLibrary()一次,因为它可能需要一段时间。 是否有一种简单而干净的方法来防止同一个库的多次加载?

使用JNA(JAVA)的GetAsyncKeyState和VirtualKeys /特殊字符

我正在进行双向私聊,这将在全屏游戏中运行。 这需要让用户在屏幕顶部键入半透明文本框, 即使它没有焦点也是如此 。 使用以下代码, 我可以检测所有物理键 ,但使用虚拟键时会很困难。 检测到SHIFT 。 检测到2 。 但是, Shift + 2被检测为单独的键(即使[SHIFT+2]在键盘上给出@ )。 IE:程序输出SHIFT和2,但不输出它们产生的内容: @ 。 问题是,我将如何根据键盘转换为角色? 例如: 在英国键盘上,SHIFT + 2会给我” (引号)。 在美国键盘上,SHIFT +2会给我@ 。 如何根据键盘转换为特定字符? 这是到目前为止的代码: static interface User32 extends Library { public static User32 INSTANCE = (User32) Native.loadLibrary(“User32”, User32.class); short GetAsyncKeyState(int key); short GetKeyState(int key); IntByReference GetKeyboardLayout(int dwLayout); int MapVirtualKeyExW […]

使用JNI创建,填充和返回Java类实例

我正在尝试使用JNI函数创建Java类,并使用DeviceId.java构造函数方法设置该类的一些属性。 我能够使用GetMethodID获取构造函数方法,但是如何创建Device.java的新实例然后设置属性(setId和setCache)。 目标是将完全填充的Device.java对象实例返回给调用者。 有任何想法吗? JNIfunction: JNIEXPORT jobject JNICALL Java_com_test_getID(JNIEnv *env, jclass cls) { jmethodID cnstrctr; jclass c = (*env)->FindClass(env, “com/test/DeviceId”); if (c == 0) { printf(“Find Class Failed.\n”); }else{ printf(“Found class.\n”); } cnstrctr = (*env)->GetMethodID(env, c, “”, “(Ljava/lang/String;[B)V”); if (cnstrctr == 0) { printf(“Find method Failed.\n”); }else { printf(“Found method.\n”); } return (*env)->NewObject(env, c, cnstrctr); […]

Valgrind和Java

我想使用Valgrind 3.7.0在我的Java本机代码中查找内存泄漏。 我正在使用jdk1.6.0._29。 为此,我必须设置–trace-children = yes标志。 设置该标志,我不再可以在任何java应用程序上运行valgrind,甚至可以执行以下命令: valgrind –trace-children=yes –smc-check=all java -version 将收到错误消息: Error occurred during initialization of VM Unknown x64 processor: SSE2 not supported 我已经看过这个链接: https : //bugs.kde.org/show_bug.cgi?id = 249943 ,但它没用。 没有Valgrind或没有–trace-children标志运行程序就可以了。 有谁知道我能做什么?

如何在Android NDK上使用JNI在C和Java之间传递复杂结构

我在Android应用程序的C代码中有一个复杂的结构,我想在Java端使用它。 我已经用google和stackoverflow做了一些研究,所以我从我的C结构创建了java类,但现在如何用Java创建它。 我已经找到了这些信息,关于在类中创建指针并在C端使用它: Get the field ID : (*env)->GetFieldID(…) Get the pointer : (*env)->GetLongField(…) Set the pointer : (*env)->SetLongField(…) 但我不明白它是如何运作的…… 在上面,你可以找到我到目前为止所做的事情……不是那么多! 在C方面: ComplexStructure Java_com_main_MainActivity_listenUDP(JNIEnv* env, jclass clazz) { int i,taille; ComplexStructure myStruct; taille = -1; taille = recvfrom(socket, &myStruct, sizeof(ComplexStructure ), 0, &rcvAddr, &sizeOfSock); if(taille != -1) { return myStruct; } return NULL; } 在Java方面: […]

由于Mac OS X上的“java.net.SocketException Invalid argument”,Tomcat启动失败

我们有一个在Tomcat 6上运行的应用程序(确切地说是6.0.35.0),由于Catalina.await方法中的socketAccept调用抛出SocketException,我们在Mac OS上的大多数工程师都遇到启动Tomcat的问题: SEVERE: StandardServer.await: accept: java.net.SocketException: Invalid argument at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.PlainSocketImpl.socketAccept(PlainSocketImpl.java) at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398) at java.net.ServerSocket.implAccept(ServerSocket.java:522) at java.net.ServerSocket.accept(ServerSocket.java:490) at org.apache.catalina.core.StandardServer.await(StandardServer.java:431) at org.apache.catalina.startup.Catalina.await(Catalina.java:676) at org.apache.catalina.startup.Catalina.start(Catalina.java:628) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) at mycompany.tomcat.startup.ThreadDumpWrapper.main(ThreadDumpWrapper.java:260) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.tanukisoftware.wrapper.WrapperStartStopApp.run(WrapperStartStopApp.java:238) at java.lang.Thread.run(Thread.java:722) 这会导致Tomcat在启动后立即关闭(并且没有少量的愤怒)。 […]

将Java中的byte 传递给C到JNI中的函数:如何使用jarraybyte

这是我第一次使用JNI,也是我第一次用C语言编写一些行。 我想做的很简单。 我只是尝试使用C例程切换byte []的endiannes。 在java中它是这样完成的: public void switchEndianness(byte[] array){ byte byte1; byte byte2; for(int i = 0; i < array.length ; i+=2){ byte1 = array[i]; byte2 = array[i+1]; array[i] = byte2; array[i+1] = byte1; } } 所以为了使用JNI做到这一点,我试图在JNICALL中实现相同的例程,但它不能编译。 到目前为止我写的是这样的: JNIEXPORT void JNICALL Java_CEndianness_switchEndianness(JNIEnv *env, jobject obj, jbyteArray array, jint offset, jint length){ char byte1; char byte2; […]

本机Java方法是否等同于静态Java方法?

我正在将一些本机方法重写为常规Java方法。 原生方法是否有效静态? 或者有没有他们有隐含’this’参数的情况? 谢谢!