首页 > 解决方案 > Android - JNI 的问题

问题描述

我的 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] Compile : com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor <= com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c:193:47: error: expected ')' static void convert(unsigned int &c, const float &temp1, const float ... ^ jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor .c:193:33: 注意: 匹配这个 '(' static void convert(unsigned int &c, const float &temp1, const float ... ^ jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c: 使用未声明的标识符 'temp3' ...(temp3 * 6) < 1) c = (unsigned int) ((temp2 + (temp1 - temp2) * 6 * temp3) * 100); ^ jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c:196:15: 错误:使用未声明的标识符'temp3' else if ((temp3 * 2) < 1) c = (unsigned int) (temp1 * 100); ^ jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c:196:31: 错误:使用未声明的标识符 'c' else if ((temp3 * 2) < 1) c = (unsigned int) (temp1 * 100); ^ jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c:196:51:错误:使用未声明的标识符“temp1” 否则 if ((temp3 * 2) < 1) c = (unsigned int) (temp1 * 100); ^ jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c:198:15: 错误:使用未声明的标识符 'temp3' else if ((temp3 * 3) < 2) c = (unsigned int) ((temp2 + (temp1 - temp2) * (.666) ... ^ jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c:198:31: 错误:使用未声明的标识符 'c' else if ((temp3 * 3) < 2) c = (unsigned int) ((temp2 + (temp1 - temp2) * (.666 ... ^ jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c:198:61:错误:使用未声明的标识符“temp1”,否则如果((temp3 * 3)< 使用未声明的标识符 'temp3' ...< 2) c = (unsigned int) ((temp2 + (temp1 - temp2) * (.66666 - temp3) * 6) * 100); ^ jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c:200:10: 错误:使用未声明的标识符 'c' else c = (unsigned int) (temp2 * 100); ^ jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c:200:30: 错误:使用未声明的标识符 'temp2' else c = (unsigned int) (temp2 * 100); ^ jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c:200:10: 错误:使用未声明的标识符 'c' else c = (unsigned int) (temp2 * 100); ^ jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c:200:30: 错误:使用未声明的标识符 'temp2' else c = (unsigned int) (temp2 * 100); ^ jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c:200:10: 错误:使用未声明的标识符 'c' else c = (unsigned int) (temp2 * 100); ^ jni/com_celik_abdullah_imageprocessingpart_processors_NativeImageProcessor.c:200:30: 错误:使用未声明的标识符 'temp2' else c = (unsigned int) (temp2 * 100);

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

有人可以帮忙吗?

标签: javaandroidc++candroid-ndk

解决方案


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

显而易见的解决方案是使用 C++ 编译器来编译它(例如,通过给源文件一个.cpp扩展名)。

如果由于某种原因您必须使用 C 编译器,那么您将不得不在 C 中重写该函数。
对于初学者,您可以通过const float值而不是通过引用传递所有这些参数(通过摆脱&)。我不知道为什么它们首先是参考。
第一个参数 ( 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);

推荐阅读