解决JNI在Windows环境下因长路径导致编译失败问题

之前听一个朋友反馈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进行编译的,调整后编译正常,问题解决!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容