java - 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 文件中获得了该代码。当我删除签名中的地址运算符 (&) 时,一切都很好(没有错误),但我不知道算法是否会起作用。
有人可以帮忙吗?
解决方案
您正在尝试使用 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);
推荐阅读
- linux - 剪贴板 api 从 gtk4 中删除了吗?
- android - 使用 cursorAdapter 滚动时复选框丢失状态
- typescript - createProgram 不尊重 compilerOptions.paths?
- php - 调用过程返回“成功”,但基础没有任何变化
- django - Django rest框架让用户保持登录状态
- c# - 获取登录用户的角色列表
- android - 无法使 Firebase 用于非 Gradle 构建:缺少 google_app_id。Firebase 分析已停用
- android - 运行 Espresso 测试方法作为步骤
- r - 将中间结果存储在管道中
- excel - EXCEL MATCH:从 1 个单元格内的多个条件返回 1 个匹配项