【问题标题】:Android - problems with JNIAndroid - JNI 的问题
【发布时间】:2019-10-16 22:46:35
【问题描述】:

我的 Android 项目中有以下代码(存储为 .c 文件):

static void convert(unsigned int &c, const float &temp1, const float &temp2, const float &temp3) {
    if ( (temp3 * 6) < 1) c = (unsigned int) ((temp2 + (temp1 - temp2) * 6 * temp3) * 100);

    else if ((temp3 * 2) < 1) c = (unsigned int) (temp1 * 100);

    else if ((temp3 * 3) < 2) c = (unsigned int) ((temp2 + (temp1 - temp2) * (.66666 - temp3) * 6) * 100);

    else c = (unsigned int) (temp2 * 100);

    return;
}

在代码中它被这样调用:

convert(r, temp1, temp2, temp3);

但是当我从命令行使用 ndk-build 命令编译它时,会出现以下错误:

Android NDK:未设置 APP_PLATFORM。默认为最低支持 版本 android-16。 [arm64-v8a] 编译: com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor

我从 .cpp 文件中获得了该代码。当我删除签名中的地址运算符 (&) 时,一切都很好(没有错误),但我不知道算法是否会起作用。

有人可以帮忙吗?

【问题讨论】:

    标签: java android c++ c android-ndk


    【解决方案1】:

    您正在尝试使用 C 编译器编译 C++ 代码,但这是行不通的。

    显而易见的解决方案是使用 C++ 编译器对其进行编译(例如,通过为源文件提供 .cpp 扩展名)。

    如果由于某种原因您必须使用 C 编译器,那么您必须用 C 重写函数。
    对于初学者,您可以通过值而不是通过引用传递所有这些 const float 参数(通过获取摆脱&amp;)。我不知道为什么它们首先是参考。
    第一个参数 (c) 用作写入结果的输出参数。因此,您必须将其从引用更改为指针(即unsigned int *c)。或者更好的是,跳过输出参数并让函数返回其结果:

    static int convert(const float temp1, const float temp2, const float temp3) {
        unsigned int c;
    
        if ( (temp3 * 6) < 1) c = (unsigned int) ((temp2 + (temp1 - temp2) * 6 * temp3) * 100);
        else if ((temp3 * 2) < 1) c = (unsigned int) (temp1 * 100);
        else if ((temp3 * 3) < 2) c = (unsigned int) ((temp2 + (temp1 - temp2) * (.66666 - temp3) * 6) * 100);
        else c = (unsigned int) (temp2 * 100);
    
        return c;
    }
    

    调用代码:

    r = convert(temp1, temp2, temp3);
    

    【讨论】:

      【解决方案2】:

      在 C++ 中,unsigned int &amp;c 是一个引用参数,&amp; 在这种情况下不是“地址运算符”。但是,C 中不存在引用,这就是为什么在 .c 文件而不是 .cpp 中编译此 C++ 代码时会出错的原因

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-19
        • 1970-01-01
        • 1970-01-01
        • 2011-03-19
        • 2013-05-06
        • 1970-01-01
        相关资源
        最近更新 更多