Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用C代码的快速步骤_Java_C_Java Native Interface - Fatal编程技术网

在Java中使用C代码的快速步骤

在Java中使用C代码的快速步骤,java,c,java-native-interface,Java,C,Java Native Interface,我正在开发一款具有简单像素艺术精灵的游戏。因为我计划做它的可伸缩性(我指的是整个游戏的图形缩放),我想实现一个适合像素艺术的良好缩放算法,在互联网上搜索我发现了这个,这样我就可以缩放所有的精灵(不是实时的),然后使用这些新版本 我发现这个HQX算法是用C代码实现的,一切都简化为一个简单的函数,它接受源图像的uint32\u t数组,并填充一个新的uint32\u t数组,该数组已经分配了sprite的缩放版本 签名是公正的 HQX_API void HQX_CALLCONV hq2x_32( u

我正在开发一款具有简单像素艺术精灵的游戏。因为我计划做它的可伸缩性(我指的是整个游戏的图形缩放),我想实现一个适合像素艺术的良好缩放算法,在互联网上搜索我发现了这个,这样我就可以缩放所有的精灵(不是实时的),然后使用这些新版本

我发现这个HQX算法是用C代码实现的,一切都简化为一个简单的函数,它接受源图像的
uint32\u t
数组,并填充一个新的
uint32\u t
数组,该数组已经分配了sprite的缩放版本

签名是公正的

HQX_API void HQX_CALLCONV hq2x_32( uint32_t * sp, uint32_t * dp, int Xres, int Yres )
其中两个符号声明为

#if defined( __GNUC__ )
    #ifdef __MINGW32__
        #define HQX_CALLCONV __stdcall
    #else
        #define HQX_CALLCONV
    #endif
#else
    #define HQX_CALLCONV
#endif

#if defined(_WIN32)
    #ifdef DLL_EXPORT
        #define HQX_API __declspec(dllexport)
    #else
        #define HQX_API __declspec(dllimport)
    #endif
#else
    #define HQX_API
#endif
因此,可以将目标构建为独立或库

我想做的是从Java thorugh JNI调用这个方法。我应该完成哪些任务来完成它?此外,我想知道性能是否会成为一个问题,我不这么认为,因为,如果JNI调用很昂贵,那么只需对每个sprite进行一次调用(但可能需要从JVM和本机代码来回复制大量内存)

我知道这两种语言(Java和C),所以我只需要知道完成这项任务所涉及的步骤,假设它足够简单,否则我将只接受JNI参考并研究它


提前感谢

如果您不经常缩放精灵,您可能会发现使用(Java本机访问)比使用JNI更容易。它更友好,但速度较慢。使用JNA,您可能不需要编写任何额外的本机代码

如果您确实使用JNI,通常您将在Java中创建“本机方法”(带有“本机”限定符的空方法),使用javah生成C头文件,并编写相应的C源文件来实现“本机方法”。在运行时,您需要加载本机库。(如果您在Mac上,则动态库扩展名必须为.jnilib。)


JNI调用可以以纳秒为单位进行测量。大数组可能会被复制,这会增加时间。今年早些时候,我对100000个元素的int数组进行了大约80微秒的测量。我认为使用java.io类型DirectByteBuffer可以避免这种情况。

实际上,在应用程序启动和nev时,每个精灵只需执行一次呃,还有,我会在短时间内了解JNA,同时谢谢:)我必须为每个平台提供不同的编译内容吗?我认为JNI是的,JNA不是很确定,因为我还不知道它是什么。您可以提供Java代码的单个编译,但是您需要为不同的平台提供不同的本机库。有了JNI,是的,您需要一个本机库来实现您的JNI native方法,以及HQX所需的任何本机库。使用JNA,除了为HQX获取或构建的本机库之外,您可能不需要任何本机库。为什么不将C代码转换为Java?转换过程中可能很少工作,除非涉及指针。我考虑过这一点,这就是为什么我要求执行步骤..到衡量一下我需要花费多少精力来将Java与现有代码连接起来,而不是直接翻译它。。