【问题标题】:nvcc generating invalid error compiling JNI codenvcc 在编译 JNI 代码时生成无效错误
【发布时间】:2019-12-27 21:07:50
【问题描述】:
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176

错误是:

MyFile.cu(231): error: expression must have pointer type

相关代码:

JNIEXPORT jboolean JNICALL Java_MyFile_convergeMatrixCuda (
    JNIEnv *env, jclass clazz, jfloatArray fxnMatrixJ, jfloatArray mulMatrixJ, jfloatArray addMatrixJ, 
    jfloatArray resultsJ, jint numRowsJ, jint numColsJ, jint maxIterations, jfloat epsilonJ)
{
    int     numRows = (int) numRowsJ;
    int     numCols = (int) numColsJ;
    int     maxIter = (int) maxIterations;
    float   epsilon = (float) epsilonJ;
    float   *fxnMatrixH = (*env)->GetFloatArrayElements (env, fxnMatrixJ, NULL);

GetFloatArrayElements 返回一个浮点数*。将“(*env)->GetFloatArrayElements”替换为“env->GetFloatArrayElements”会出现以下错误:

float   *fxnMatrixH = env->GetFloatArrayElements (env, fxnMatrixJ, NULL);

MyFile.cu(231): error: argument of type "JNIEnv *" is incompatible with parameter of type "jfloatArray"

MyFile.cu(231): error: argument of type "jfloatArray" is incompatible with parameter of type "jboolean *"

MyFile.cu(231): error: too many arguments in function call

nvcc 在编译非 JNI 代码时确实可以正常工作

【问题讨论】:

    标签: java-native-interface nvcc


    【解决方案1】:

    NVidia's documentation 声明

    CUDA 应用程序的源文件由传统的 C++ 主机代码和 GPU 设备函数混合而成。

    (*env)->GetFloatArrayElements (env, fxnMatrixJ, NULL); 是您在 C 中调用 JNI 函数的方式。但在 C++ 中它将是 env->GetFloatArrayElements(fxnMatrixJ, NULL);

    【讨论】:

    • 我试过了。我收到“错误:“JNIEnv *”类型的参数与参数不兼容”错误
    • 根据您在问题中写的内容,您尝试了env->GetFloatArrayElements(env, fxnMatrixJ, NULL);。请注意,这与我所说的你应该写的不同。
    猜你喜欢
    • 2017-01-27
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多