Tag: java

JNI – C ++ / Java中的监听器 – 可以用c ++实例化Java对象并将它们用作参数

以下是否适用于JNI? public NativeClass { static { System.loadLibrary(“dll”); } public static native void addListener(Listener listener); } public interface Listener { public void eventOccurred(Info info); } public Info { private final String s1; private final String s2; public Info(String s1, String s2); // … getters for use in Java } 是否有可能 在dll上注册一个Listener对象(据我所知,应该没问题) 在c / c ++代码中实例化一个Info对象,并将其用作调用Listener.eventOccured(Info…)的参数? 或者什么是实现从DLL获取一些信息的侦听器的好方法? […]

使用Swig的JNI for C和函数指针回调的麻烦

我们在java中加载的一个库中有一个C函数,它接受一个函数指针 function定义如下 typedef char int8 typedef unsigned short uint16 uint32 poll_broadcasts(void *(pfn)(int8*,uint16)); 在C中,它如下使用 void handle_broadcasts( int8 *broadcast, uint16 length ) uint32 a = poll_broadcasts( (void*(*)(int8*,uint16)) handle_broadcasts ) 但是当您使用Swig生成JNI包装器时,它会为poll_broadcast创建以下定义 public static long poll_broadcasts(SWIGTYPE_p_f_p_char_unsigned_short__p_void pfn) { return TestJNI.poll_broadcasts(SWIGTYPE_p_f_p_char_unsigned_short__p_void.getCPtr(pfn)); } 按照答案 我应该如何编写.i文件来包装Java或C#中的回调 试过下面 test.h void * data; typedef void* (*callback_handle_broadcast_t)(int8*, uint16); static callback_handle_broadcast_t handle_broadcast; static void set_handle_broadcast(callback_handle_broadcast_t cb, […]

在cygwin上编译hsdis(Java HotSpot反汇编程序插件)时,错误的reloc地址0x0

我正在尝试编译JVM需要反汇编JIT编译代码的hsdis-amd64.dll库。 我按照这个接受的答案。 我安装了cygwin 下载了openjdk-7u40-fcs-src-b43-26_aug_2013.zip 并下载了binutils-2.24.tar.gz 我创建了一个这样的文件夹结构: + +- hsdis // unzipped dir hotspot/src/share/tools/hsdis of openjdk zip +- binutils-2.24 // unzipped binutils-2.24.tar.gz 首先,我尝试使用以下方法编译它: $ make OS=Linux MINGW=x86_64-w64-mingw32 BINUTILS=../binutils-2.24 但它失败了 /Linux-amd64/opcodes/libopcodes.a build/Linux-amd64/libiberty/libiberty.a hsdis.c:32:20: fatal error: sysdep.h: No such file or directory #include ^ compilation terminated. 所以我应用了此接受答案中提供的补丁并再次尝试。 编译再次失败 In file included from hsdis.c:34:0: build/Linux-amd64/bfd/bfd.h:35:2: error: #error config.h must […]

用于确定给定数量N是否可以成为具有所有3个整数边的直角三角形的斜边的算法

假设您给出了一个直角三角形的斜边,那么如何确定给定的斜边是否有两个可能的小边。 例如,你将斜边视为5.然后你必须确定给定的直角三角形是否有较小的整数边。答案是yes因为我们可以将较小的边用作3和4,因此得到3-4- 5直角三角形。 同样,对于斜边7,我们可以没有这样的直角三角形。 换句话说,我们必须找出给定数字N是否可以作为右三角形的斜边,所有三边都是整数。 我阅读了关于毕达哥拉斯三重奏的整篇文章,但仍然没有成功。我很困惑要检查哪些条件。请帮忙。

Java比C更快

今天我做了一个简单的测试来比较java和c之间的速度 – 一个简单的循环使整数“i”从0增加到20亿。 我真的希望c语言比java更快。 我对结果感到惊讶: java的时间以秒为单位:约 。 1.8秒 c:约需要几秒钟的时间 3.6秒 我不认为java是一种更快的语言,但我不明白为什么循环的速度是我简单程序中c的两倍? 我在节目中做了一个至关重要的错误吗? 或者是MinGW的编译器配置不当还是什么? public class Jrand { public static void main (String[] args) { long startTime = System.currentTimeMillis(); int i; for (i = 0; i < 2000000000; i++) { // Do nothing! } long endTime = System.currentTimeMillis(); float totalTime = (endTime – startTime); System.out.println("time: " […]

如何将JVM跳转指令的偏移量设置为32768?

在写一个关于JVM字节代码偏移的问题的答案时 ,我注意到javac的行为以及我无法解释的结果类文件: 编译这样的类时 class FarJump { public static void main(String args[]) { call(0, 1); } public static void call(int x, int y) { if (x < y) { y++; y++; // … (10921 times – too much code to post here!) y++; y++; } System.out.println(y); } } 然后生成的字节代码将包含以下if_icmpge指令: public static void call(int, int); Code: 0: […]

是否有可能比C中的同一程序(优化)更快地获得Java程序?

关于在编译时生成C / C ++优化的事实,并且在运行时生成Java优化。 是否有可能比C中的同一程序(优化)更快地获得Java程序? 我知道运行时优化可能比编译时更好。 因此,我想知道这些优化的好处是否可以与运行JVM的开销进行比较。

什么是java.io.Serializable的C / C ++等价?

什么是java.io.Serializable的C / C ++等价? 有关序列化库的参考: 用C语言序列化数据结构 还有: http://troydhanson.github.io/tpl/index.html http://www.boost.org/doc/libs/1_41_0/libs/serialization/doc/index.html https://developers.google.com/protocol-buffers/docs/cpptutorial#optimization-tips 但这样的等价甚至存在吗? 因此,如果我在Java中有如下的抽象类,那么C / C ++中的可序列化类如何? import java.io.Serializable; public interface SuperMan extends Serializable{ /** * Count the number of abilities. * @return */ public int countAbility(); /** * Get the ability with index k. * @param k * @return */ public long getAbility(int k); /** * […]

算法从中间向外循环一个数组?

我正在研究一种分而治之的算法(事实上,这种算法可以对多个输入点进行曲线拟合)。 对于“除法”部分,我需要计算每个点的误差项,如果误差超过给定的阈值,我希望在该点分割曲线并分别处理输入的左右部分。 一个简单的循环就可以了; 但是对我来说,从当前部分的中间开始并向外工作将是有利的。 (澄清一下:如果我找到一个误差太大的点,我会递归调用并为左右两部分生成单独的曲线 – 如果所有点都在阈值范围内,那么我的曲线适合我返回)。 经过一番搔痒之后,我想出了这个(点数在一个数组中,当前部分是从startIndex到endIndex ): int steps = (endIndex+1-startIndex); int i = (startIndex+endIndex)>>1; int stepdir = 1; for(int q=0; q<steps; q++, i+=stepdir*q, stepdir=-stepdir) { // test point i here and return early if error exceeds threshold } 换句话说,从中间开始,前进一个指数,前进两个,前进三个,后退四个……它有效,我确信它是有效的,但它让我感到应该有一个更清洁的方法来做到这一点特别是,我最终必须检查Java语言规范,以确保for update表达式中的语句按顺序进行评估(即使它不是C / C ++中的序列运算符)。 感谢任何想法。 有更干净的方式吗?

Java比C快2倍(作为C ++的一个子集)

下面的代码是一种非常低效的乘法算法。 它被写成测试目的。 我相信我用不同的语言编写了相同的代码。 正下方是运行代码的结果。 OS: Windows 7 language: C (as a subset of C++) compiler: Visual C++ optimization option: /Ox /Oi /Ot /Oy /GL running time (seconds): 40 +/- 1 compiler: MinGW/gcc optimization option: -O3 march=native running time (seconds): 81 +/- 1 compiler: MinGW/g++ optimization option: -O3 march=native running time (seconds): 82 +/- 1 language: […]