Android studio cmake报错

本文记录了在Android Studio中使用JNI编程遇到的问题及解决方案。主要问题是编译器不支持特定宏定义,导致JNIEXPORT和JNICALL等关键字出错,通过修改jni_md.h文件解决了这一问题。

今天在抽出了一点时间准备在Android studio上实现jni编程。

按照步骤创建了一个带c++的android项目,编译的时候问题来了:


环境:

Android studio2.3.2

jdk1.8.0

sdk25

ndk14.1


问题

1.JNIEXPORT和JNICALL都提示Error after macro substitution: Microsoft attributes are not supported by the complier

error: unknown type name '__declspec'

2.__int64认不到


解决办法:

在网上爬了很久,没有在解决办法。

最后总结网上说的和根据自己经验:

问题产生的原因:

1.是编译工具不支持window的导出动态库的属性声明,

JNIIMPORT __declspec(dllimport)
JNICALL __stdcall
2.linux环境下需要定义jlong为long long


最终修改${JAVA_HOME}\include\win32\jni_md.h文件如下




问题解决,mark一下,备查。




最后

### Android Studio 中 SVD 报错的解决方案 在 Android Studio 中使用奇异值分解(SVD)时,可能会遇到编译或运行时错误。以下是一些可能的原因及解决方案: 1. **Eigen 库版本问题** 如果您正在使用 Eigen 库进行矩阵运算,并且遇到了与 SVD 相关的错误,可能是由于库版本不兼容导致的。根据引用[^3],Eigen 3.0.6 版本修复了多个与几何模块和稀疏矩阵相关的编译问题。因此,建议升级到最新版本的 Eigen 库以确保兼容性。 2. **NDK 配置问题** 在 Android NDK 中,可能存在宏定义冲突的问题。例如,`isfinite` 宏可能导致编译错误。为了解决这个问题,可以在 `Application.mk` 文件中添加以下配置: ```makefile APP_CFLAGS += -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS ``` 这将避免宏定义冲突。 3. **CMake 或 ndk-build 配置问题** 确保您的 CMakeLists.txt 文件正确配置了 Eigen 库路径。例如: ```cmake set(EIGEN_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/third_party/eigen) include_directories(${EIGEN_INCLUDE_DIR}) ``` 同时,确保在 `native-lib.cpp` 文件中正确包含 Eigen 头文件: ```cpp #include <Eigen/Dense> ``` 4. **代码实现问题** 以下是使用 Eigen 库进行 SVD 分解的一个简单示例: ```cpp #include <jni.h> #include <string> #include <Eigen/Dense> extern "C" JNIEXPORT jstring JNICALL Java_com_example_myapp_MainActivity_stringFromJNI(JNIEnv *env, jobject /* this */) { try { Eigen::MatrixXd A(3, 2); A << 1, 2, 3, 4, 5, 6; Eigen::JacobiSVD<Eigen::MatrixXd> svd(A, Eigen::ComputeThinU | Eigen::ComputeThinV); Eigen::MatrixXd U = svd.matrixU(); Eigen::VectorXd singularValues = svd.singularValues(); Eigen::MatrixXd V = svd.matrixV(); std::string result = "U:\n" + std::string(U.format(Eigen::IOFormat())) + "\nSingular Values:\n" + std::string(singularValues.format(Eigen::IOFormat())) + "\nV:\n" + std::string(V.format(Eigen::IOFormat())); return env->NewStringUTF(result.c_str()); } catch (const std::exception& e) { return env->NewStringUTF(("Error: " + std::string(e.what())).c_str()); } } ``` 在此示例中,`JacobiSVD` 是用于计算 SVD 的类。如果出现错误,请检查输入矩阵是否符合预期维度,并确保未发生内存泄漏。 5. **其他可能原因** 如果上述方法无法解决问题,可以尝试以下步骤: - 检查 NDK 和 Gradle 插件版本是否匹配。 - 清理并重新构建项目:`Build > Clean Project` 和 `Build > Rebuild Project`。 - 确保所有依赖项已正确导入。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值