2013-10-06 103 views
-1

我正在将C++程序转换为Java,并且遇到了麻烦,因为java中没有memcpy。尝试将C++程序转换为Java。需要Memcpy帮助

在做了一些研究之后,我已经采取了最好的措施,但是我真的很犹豫,并且不确定这是否应该像C++程序那样做,因为我发现迄今发现的信息有点儿混乱。

(Java代码仍具有的memcpy但注释为refernce)

该票据两个
图片=输入图像
输出=输出图像
N =图片
M的宽度=高度图片。

在C++代码中,元素是一个unsigned short int。

C++代码

void medianfilter(element* image, element* result, int N, int M) 
{ 
    // Check arguments 
    if (!image || N < 1 || M < 1) 
     return; 
    // Allocate memory for signal extension 
    element* extension = new element[(N + 2) * (M + 2)]; 
    // Check memory allocation 
    if (!extension) 
     return; 


    // Create image extension 
    for (int i = 0; i < M; ++i) 
    { 
     memcpy(extension + (N + 2) * (i + 1) + 1, image + N * i, N * sizeof(element)); 
     extension[(N + 2) * (i + 1)] = image[N * i]; 
     extension[(N + 2) * (i + 2) - 1] = image[N * (i + 1) - 1]; 
    } 
    // Fill first line of image extension 
    memcpy(extension, extension + N + 2, (N + 2) * sizeof(element)); 
    // Fill last line of image extension 
    memcpy(extension + (N + 2) * (M + 1), extension + (N + 2) * M, (N + 2) * sizeof(element)); 
    // Call median filter implementation 
    _medianfilter(extension, result ? result : image, N + 2, M + 2); 
    // Free memory 
    delete[] extension; 
} 

Java代码迄今。

public static void medianfilter(long[] image, long[] result, int N, int M) 
{ 
    // Check arguments 
    if (N < 1 || M < 1) 
     return; 
    // Allocate memory for signal extension 
    long[] extension = new long[(N + 2) * (M + 2)]; 

    // Create image extension 
    for (int i = 0; i < M; ++i) 
    { 
     //memcpy(extension + (N + 2) * (i + 1) + 1, image + N * i, N * sizeof(element)); 
     for(int k = 0 ; k < N ; k++) 
     { 
      extension[(N+2 * (i+1)+1)+k] = image[(N*i)+k]; 
     } 

     extension[(N + 2) * (i + 1)] = image[N * i]; 
     extension[(N + 2) * (i + 2) - 1] = image[N * (i + 1) - 1]; 
    } 
    // Fill first line of image extension 
    //memcpy(extension, extension + N + 2, (N + 2) * sizeof(element)); 
    // Fill last line of image extension 
    //memcpy(extension + (N + 2) * (M + 1), extension + (N + 2) * M, (N + 2) * sizeof(element)); 
    // Call median filter implementation 
    //_medianfilter(extension, result ? result : image, N + 2, M + 2); 
} 

我高度怀疑我做错了,只是想在这方面得到一些帮助。 (程序的其余部分很简单,因为它不使用memcpy)。

回答

0

的Java实际上确实有东西一样的memcpy()。不安全类有一个与memcpy()基本相同的copyMemory()方法。当然,就像memcpy()一样,它不提供内存覆盖,数据销毁等保护。不清楚它是真的是memcpy()还是memmove()。它可用于从实际地址复制到实际地址或从参考文献引用。请注意,如果使用引用,则必须提供偏移量(否则JVM将尽快死亡)。 ()我的老累PC上每秒钟高达2 GB)。使用风险自负。请注意,所有JVM实现都不存在不安全类。

您还应该看看“Java中的直接内存访问技巧”(http://highlyscalable.wordpress.com/2012/02/02/direct-memory-access-in-java/)和“Java Magic。第4部分:sun.misc.Unsafe”(C++到Java等效的memcpy函数) 。这些人深谙如何在Java中进行低级(和风险)操作。

3

实际上,Java的形式为memcpy,调用为Arrays.copyOf

memcpy(source, dest, size) 

成为

long[] dest = Arrays.copyOf(source, newSize);