【问题标题】:error: parse error before "double" (cygwin)错误:在“双”之前解析错误(cygwin)
【发布时间】:2012-12-05 16:36:34
【问题描述】:

所以这是我正在使用的代码: 测试.java:

public class HelloWorld {
    static {
        System.loadLibrary("SumLib");
    }

    public static void main(String args[])
    {
        Random rand = new Random();
        double[] arr = new double[10];
        for(int i = 0; i < 11; i++) {
            arr[i] = rand.nextDouble();
        }
        NativeMethods.sumOfArr(arr);
}
}

NativeMethods.java:

public static native double sumOfArr(double[] arr);

NativeMethods.c:

JNIEXPORT jdouble JNICALL Java_NativeMethods_sumOfArr(JNIEnv *env, jclass cls, jdoubleArray arr) {
    return sumOfArr(double *arr);
}

NativeMethods.h 由 cygwin 中的“javah NativeMethods”生成。

sum.c:

double sumOfArr(double* arr) {
    int i;
    double sum = 0;
    for(i = 0; i < 10; i++) {
        sum =+ arr[i];
    }
    return sum;
}

sum.h:

double sumOfArr(double *arr);

当我尝试在 cygwin 中编译/制作 SumLib.dll 时出现问题,它会抛出这个错误:

$ gcc -Wl,-add-stdcall-alias -mno-cygwin -shared -I"/cygdrive/c/jdk1.7.0_09/include" -I"/cygdrive/c/jdk1.7.0_09/include/win32" -o SumLib.dll sum.c NativeMethods.c
NativeMethods.c: In function `Java_NativeMethods_sumOfArr':
NativeMethods.c:19: error: parse error before "double"

我被困在这里几个小时试图完成这项工作...... 有什么问题?

【问题讨论】:

  • 试试return sumOfArr(arr);。您不能将类型放入调用中。或者可能return sumOfArr((double *)arr);你想要演员?
  • 不是您问题的答案,但您在main 中的循环是从011。这将在运行时抛出ArrayIndexOutOfBoundsException
  • NativeMethods.c 文件的第 19 行在哪里?
  • 错字使用+= 而不是=+
  • 现在我刚刚看到,即使是正确创建的数组,它也会被发送到 NativeMethod 和 sum.c,但是当它返回到主类时,我正在尝试显示数组的总和,它完全显示随机数。我什至试图把 sum = arr[4]; (一个元素)。但它没有显示与数组的第四个元素相同的元素。只有随机数。

标签: java c arrays java-native-interface cygwin


【解决方案1】:

你不能这样做,因为它不会编译

return sumOfArr(double *arr);

甚至这个

return sumOfArr((double *)arr);

因为jdoubleArray 不是double *,它有一个开头的标题。

您需要使用 Java 提供的辅助方法来访问此数组的元素。

【讨论】:

  • Java 提供的用于访问该数组元素的辅助方法是什么?
  • 不记得我的头顶所以不得不谷歌jdoubleArray,你想要的方法是double * data = env-&gt;GetDoubleArrayElements(*arr, NULL);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多