Tag: jni

如何从JNI返回枚举

在java我有: public class MyClass{ public enum STATUS { ZERO, ONE , TWO } public native STATUS nativeGetStatus(); … private STATUS state = nativeGetStatus(); //returns enum private STATUS state2 = nativeGetStatus(); //returns enum } 我希望本机方法’nativeGetStatus’返回此枚举值。 JNI返回整数并与java中的枚举值进行比较是一个选项,但是想知道是否可以通过jobject返回值并将其直接分配给状态? 如果有,怎么样?

使用long将指针从JNI传递到Java

我正在尝试将结构作为指针从JNI传递给Java,以便稍后可以将其从Java传递回JNI。 我已经读过这个post: 通过JNI传递C和Java之间的指针 ,但是我没有成功。 我有一个非常复杂的结构: struct myStruct_s myStruct; 从Java,我调用一个JNI函数来初始化结构并返回一个long(指向结构的指针): JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) { struct myStruct_s mystruct; long *lp = (long*)&myStruct; return lp; } 然后我用一个长的参数调用一个Java方法。 在JNI中,我希望能够使用之前创建的strcuture。 我喜欢这个: JNIEEXPORT jint JNICALL Java_example_ExampleJNI_methode1(JNIEnv *jenv, jclass jcls, jlong jarg) { struct myStruct_s *arg = (struct myStruct_s *)&jarg; … } 好吧它不起作用。 我想我对结构的长期投射是错误的。 我该怎么办? 谢谢。 编辑 :感谢您的提示,这里是工作function […]

JNI – 如何从C ++或C回调到Java?

我有Java应用程序调用本机C ++ / C代码。 C ++ / C代码需要回调到Java。 你能给我一些如何做到这一点的例子。

将本机指针存储在Java对象中的“正确”方法是什么?

将本机指针存储在Java对象中的“正确”方法是什么? 我可以将指针视为Java int ,如果我碰巧知道本机指针的大小是<= 32位,或者如果我碰巧知道原生指针的大小是<= 64位,那么我会把它当作Java。 但有没有更好或更清洁的方法来做到这一点? 编辑 :从JNI函数返回本机指针正是我不想做的。 我宁愿返回一个代表本机资源的Java对象。 但是,我返回的Java对象必须有一个包含指针的字段,这使我回到原始问题。 或者,是否有更好的方法让JNI函数返回对本机资源的引用?

如何设置java库路径进行处理

我正在使用PDE运行Processing sketch,我收到以下错误: validation是否正确设置了java.library.path属性。 你们有人能告诉我如何解决这个问题吗?

使用Delphi的java类

我需要使用一些java类中包含的逻辑。 我找到了JNI,但该项目最近似乎没有更新。 有没有办法在Delphi本机应用程序中使用它? 我使用Delphi 2009。

C ++ ifstream.getline()明显慢于Java的BufferedReader.readLine()?

我正在重写我的一个Android应用程序以利用NDK,每次打开一个1.5MB的文本文件(大约150k行)时,首先要做的事情之一就是把每一行放在一个数据中结构体。 当我使用Java的BufferedReader.readLine()执行此操作时,从SD卡读取文件大约需要2.5秒。 这是我用于此的代码: try { BufferedReader br = new BufferedReader(new FileReader(“/sdcard/testfile.txt”)); String thisLine; while ((thisLine = br.readLine()) != null) { Log.d(TAG, thisLine); } } catch (IOException e) { //Log error } 在ifstream中使用C ++需要更长的时间……对于同一个文件大约需要3分钟。 这是我在C ++中使用的代码: char buffer[256]; ifstream ifs; ifs.open(“/sdcard/testfile.txt”, ifstream::in); if (ifs.is_open()) { while (!ifs.eof()) { ifs.getline (buffer,100); LOGD(buffer); } } 我对C ++很生疏,但是对于增加的读取时间没有任何合理的解释。 有一段时间我以为它可能是LOGDfunction,但我尝试完全取消它,读取时间根本没有多大帮助。 […]

有没有办法通过JNI将Java数组传递给C而不复制它?

我知道使用GetDoubleArrayElements,JVM决定是否复制Array的元素。 在这种情况下,有没有办法避免副本? 如果没有,是否有其他方式从Java转移到C而不复制? 我正在传递非常大的arrays,我希望我能避开副本。 谢谢

Java和Haskell之间的通信

我用Google搜索并获得了一些答案,可以通过GCJNI(现在网站已关闭)和LambdaVM完成Java和Haskell之间的通信。要使用LambdaVM / GCJNI,我是否需要下载任何构建工具? 我在哪里可以了解更多关于它们的信息,因为我在网上找不到太多资源? 我想开发一个在Java和Haskell之间进行通信的应用程序(我将从Java获取输入,将其传递给Haskell并在那里处理并将结果返回给Java)。这就是我想要做的。 请帮帮我…

SWIG(v1.3.29)生成的C ++到Java Vector类不能正常运行

我有一些本机C ++代码,我正在使用SWIG转换为Java,以便我的Java应用程序可以使用它。 特别是有一些函数返回std :: vector。 这是我的界面文件的片段: %include “std_vector.i” namespace std { %template(Vector) vector; %template(Matrix) vector<vector >; } %include “std_string.i” std_string.i和std_vector.i包含在我正在使用的SWIG构建中。 我的第一个惊喜是Java输出包含了SWIG的“自有”版本的Vector类(而不是使用java.util.Vector )。 我真正的问题是从这些函数返回的Vector似乎不起作用。 例如,我无法使用get() (有时会使程序崩溃)或size()函数返回负值来检索其内容。 我知道Vector包含数据,因为我编写了相同函数的’String’版本,它们简单地遍历Vector (返回原生C ++代码)并以逗号分隔的String值返回内容。 虽然这是一个有效的解决方法,但最终我希望这能够正常工作,因为我能够接收和操作Vectors 。 任何帮助/提示将不胜感激。