之前听一个朋友反馈LuaScriptoCore在Windows下编译会报错,今天特意跑到Windows环境下测试了一番,果然是存在问题。得到了下面的编译报错信息:

Build command failed.

Error while executing process C:\Users\vimfung\AppData\Local\Android\Sdk\ndk-bundle\ndk-build.cmd with arguments {NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Users\vimfung\Documents\LuaScriptCore\Source\Unity3D\Android\luascriptcore-unity-android\src\main\jni\Android.mk APP_ABI=arm64-v8a NDK_ALL_ABIS=arm64-v8a NDK_DEBUG=1 APP_PLATFORM=android-21 NDK_OUT=C:/Users/vimfung/Documents/LuaScriptCore/Source/Unity3D/Android/luascriptcore-unity-android/build/intermediates/ndkBuild/debug/obj NDK_LIBS_OUT=C:\Users\vimfung\Documents\LuaScriptCore\Source\Unity3D\Android\luascriptcore-unity-android\build\intermediates\ndkBuild\debug\lib APP_CPPFLAGS+=-frtti APP_CPPFLAGS+=-fexceptions APP_CPPFLAGS+=-std=gnu++11 APP_CPPFLAGS+=-Wno-format-contains-nul APP_CPPFLAGS+=-g APP_CPPFLAGS+=-Wno-deprecated-declarations APP_CPPFLAGS+=-fpermissive APP_STL=gnustl_static NDK_DEBUG=1 APP_PLATFORM=android-14 NDK_TOOLCHAIN_VERSION=4.9 C:/Users/vimfung/Documents/LuaScriptCore/Source/Unity3D/Android/luascriptcore-unity-android/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a/libLuaScriptCore-Unity-Android.so}

Android NDK: WARNING: Unsupported source file extensions in C:\Users\vimfung\Documents\LuaScriptCore\Source\Unity3D\Android\luascriptcore-unity-android\src\main\jni\Android.mk for module LuaScriptCore-Unity-Android

Android NDK: ../../../../../../lua-core/src/lua.hpp

[arm64-v8a] Compile++ : LuaScriptCore-Unity-Android <= LuaScriptCoreForUnity.cpp

C:/Users/vimfung/Documents/LuaScriptCore/Source/Unity3D/Android/luascriptcore-unity-android/src/main/jni/../../../../../UnityCommon/LuaScriptCoreForUnity.cpp:616:1: fatal error: opening dependency file C:/Users/vimfung/Documents/LuaScriptCore/Source/Unity3D/Android/luascriptcore-unity-android/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a/objs-debug/LuaScriptCore-Unity-Android/C_/Users/vimfung/Documents/LuaScriptCore/Source/Unity3D/Android/luascriptcore-unity-android/src/main/jni//UnityCommon/LuaScriptCoreForUnity.o.d: No such file or directory

}

^

compilation terminated.

make: *** [C:/Users/vimfung/Documents/LuaScriptCore/Source/Unity3D/Android/luascriptcore-unity-android/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a/objs-debug/LuaScriptCore-Unity-Android/C/Users/vimfung/Documents/LuaScriptCore/Source/Unity3D/Android/luascriptcore-unity-android/src/main/jni/_/UnityCommon/LuaScriptCoreForUnity.o] Error 1

其中最重要的信息就是这段描述:

fatal error: opening dependency file C:/Users/vimfung/Documents/LuaScriptCore/Source/Unity3D/Android/luascriptcore-unity-android/build/intermediates/ndkBuild/debug/obj/local/arm64-v8a/objs-debug/LuaScriptCore-Unity-Android/C_/Users/vimfung/Documents/LuaScriptCore/Source/Unity3D/Android/luascriptcore-unity-android/src/main/jni/__/UnityCommon/LuaScriptCoreForUnity.o.d: No such file or directory

意思是说没有找到对应的LuaScriptCoreForUnity.o.d文件。后来经过查找资料发现是因为Windows下如果你的路径超长,其实会导致编译失败,无法生成.o文件,因此就会出现无法找到的提示。

对于出现这种情况,可以尝试下面三种方案:

方案一:修改长路径文件

手动调整项目中的文件路径和文件名称来缩短编译的文件路径,让它在限制的长度以内。

不过这种方式不太适用于我的项目,主要因为我的项目是一款SDK,不能太随意地调整文件名称和目录结构。

方案二:Gradle编译设置

打开项目的build.gradle文件,在allprojects项下添加下面设置:

allprojects {

if(org.gradle.internal.os.OperatingSystem.current().isWindows())

{

//Windows下由于路径问题会导致编译报错,这里重新设置build路径

buildDir = "C:/tmp/${rootProject.name}/${project.name}"

}

repositories {

jcenter()

google()

}

}

该设置主要是判断当前环境是否为Windows,如果是则将编译目录设置到C:/tmp目录下。

这种方式跟方案一类似,但是不会调整编译文件的名字,但是能够改变编译输出的路径。经过尝试能够解决部分项目编译问题,但是对于一些项目路径较深的项目依然不适用。

方案三:调整Android.mk文件

该方式主要针对使用mk文件进行编译的项目,如果你的mk文件中设置的LOCAL_SRC_FILES项中每个编译文件都带有$(LOCAL_PATH)环境变量,那么可以将这个变量给移除调,再进行编译。

估计是因为JNI编译问题,编译产生的文件会根据你在mk文件中指定的路径来创建,如果你在mk文件中配置了$(LOCAL_PATH)/cpp/Test.cpp,那么,它会先对这个编译路径进行解析,假设文件就放在C:/project/sample/下,那么转换出来的路径就是C:/project/sample/cpp/Test.cpp,最终输出文件路径就会是C:/tmp/buildDir/C/project/sample/cpp/Test.o。这样无形中增加了三级目录,而这目录正是$(LOCAL_PATH)带来的。

所以移除后这个环境变量后项目就会以相对路径来查找编译文件,不会影响编译,同时也能够去除掉由于$(LOCAL_PATH)产生的多余目录路径。我的项目正好是使用Android.mk进行编译的,调整后编译正常,问题解决!

windows下编译c语言文件路径,解决JNI在Windows环境下因长路径导致编译失败问题相关推荐

  1. GCC 编译 C 语言文件

    GCC 编译 C 语言文件 题目要求 请编写一个主程序文件 main1.c 和一个子程序文件 sub1.c 要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b) ...

  2. linux误删 bin目录,记linux下rm误删bin文件的解决方式

    平常有个坏习惯,删文件为了快点,喜欢用rm xx*,删除一些关键词文件.今天为了删/bin下几个含有mix关键词的文件,使用命令rm mix*.手贱,mix和*之间多了个空格...灾难发生了!bin下 ...

  3. win10不能上传文件到服务器,Win10系统下蓝牙无法传输文件怎么解决

    在win10系统中,自带有蓝牙功能,可以方便用户们进行数据传输等,但是有些用户却反映说遇到蓝牙无法传输文件的情况,该怎么解决这样的情况呢?本文就给大家讲解一下Win10系统下蓝牙无法传输文件的具体解决 ...

  4. 软件工程专业画图工具Jude的安装与Windows找不到javaw文件的解决办法

    画图工具JUDE的安装与Windows找不到javaw文件的解决办法 文章目录 画图工具JUDE的安装与Windows找不到javaw文件的解决办法 1.工具 2.安装 3.Windows找不到jav ...

  5. U盘文件夹变exe的win10环境下纯手工解决方法(无需任何软件)

    U盘文件夹变exe的win10环境下纯手工解决方法(无需任何软件) 把U盘插入装有win10系统的电脑 打开U盘目录(这里假设U盘目录是G:) 选中变成exe的文件,删除(放心,这里的exe是一个几k ...

  6. 解决锐捷校园网环境下VMware虚拟机无法上网问题

    解决锐捷校园网环境下VMware虚拟机无法上网问题 1.介绍: 在介绍笨方法之前首先得说一下VMware虚拟机无法上网的原因,虚拟机要想要上网主机里的VMnetDHCP和VMware NAT Serv ...

  7. Python语言学习:解决python版本升级问题集合(python2系列→Python3系列)导致错误的总结集合

    Python语言学习:解决python版本升级问题集合(python2系列→Python3系列)导致错误的总结集合 目录 Python版本升级的原因 Text and binary data in P ...

  8. 编译高性能linux so库,关于如何在linux环境下生成a库和so库(改,附图)-Go语言中文社区...

    一般linux环境下的链接库分为a库和so库,分别表示静态链接库和动态链接库,其作用是把C程序编译好做成一种可执行链接文件,c主程序文件调用这些程序的函数接口是可以使用a库或so库,在主程序中只需要i ...

  9. propertysource注解 找不到文件_WinXP系统电脑开机提示windows找不到null文件的解决方法...

    WinXP系统开机提示windows找不到null文件怎么办?XP系统电脑开机提示windows找不到null文件该如何解决?请看下文具体介绍. 操作方法: 1,这是一个驱动文件,在C:Windows ...

最新文章

  1. 每个c语言程序写完后 都要按照,c语言基础学习小结(习题总结)(5页)-原创力文档...
  2. HDU 4288 Coder [线段树]
  3. CEMAPI实战攻略(四)——发送短消息
  4. Maven打包排除某个资源或者目录
  5. java 逆矩阵,java – 如何创建逆变换矩阵
  6. Git笔记(5) 状态记录
  7. 你们都在吐槽的华为“浴霸”被这三家拿去用了...
  8. php中array_merge函数
  9. CentOS 6.7下 Samba服务器的搭建与配置(share共享模式)
  10. java 调用 cplex
  11. 未检测任何音频设备,关机假死
  12. s40之演变v1~v3
  13. android ip地址扫描仪,通过IP地址添加网络扫描仪(适用于CC2软件Mac OS)
  14. 当管理遇上“人情”,你会怎么做?
  15. PID参数调节的经验
  16. 制作Mac版的星际争霸II(StarCraft II)
  17. Linux 桌面玩家指南:02. 以最简洁的方式打造实用的 Vim 环境
  18. spring04:注入依赖
  19. 服务器4块固态硬盘做raid5,RAID 5与RAID 10、硬盘和固态硬盘
  20. Problem E: 薪酬计算

热门文章

  1. IE6和其他浏览器的css样式不同
  2. 从C语言到C++的进阶之C++的非类新特性(篇三)
  3. 初学者python笔记(hashlib加密、logging日志模块、configparser配置文件)
  4. linux软件包管理 pdf,中标麒麟Linux系统软件包管理介绍(22页)-原创力文档
  5. 中日文字编码转换_关于编码你必须知道的知识和技巧
  6. Python中超类是如何知道自己被继承的
  7. 一个傻傻的尼姆游戏及其Python实现
  8. Python+pillow计算椭圆图形几何中心
  9. torch各个版本镜像_如何解决在cuda上安装torch后torch.cuda.is_available()返回False
  10. C++ 初识类与对象