将 Android Studio 配置为使用 NDK(android-ndk-r10d,Windows 64 位)
Posted
技术标签:
【中文标题】将 Android Studio 配置为使用 NDK(android-ndk-r10d,Windows 64 位)【英文标题】:Configuring Android Studio to use NDK (android-ndk-r10d, Windows 64-bit) 【发布时间】:2015-03-17 21:15:14 【问题描述】:我正在尝试编译一个使用 *.c 文件的应用程序。
要编译它,我必须使用 NDK。
下载了64位版本,上网找了配置gradle的小技巧。
似乎配置没问题,gradle 尝试运行 NDK 构建过程。
它通过调用 ndk-build.cmd 来执行此操作并停止并出现以下错误:
\AppData\Local\VirtualStore\Windows\SysWOW64\android-ndk-r10d\ndk-build.cmd": CreateProcess error=2, 系统找不到指定的文件
我在整个文件夹中搜索了 ndk-build.cmd,但没有。
我到底错过了什么?
EDIT1:NDK 安装在这里:
#ndk.dir=C\:\\Users\\user\\AppData\\Local\\VirtualStore\\Windows\\SysWOW64\\android-ndk-r10d
EDIT2:我确实试过我的系统路径没问题,这不是问题。然而,我确实安装了 32 位版本,而这个版本确实有 *.cmd 文件。
我现在可以编译 *.c 文件了。
我在 AndroidStudio 终端中使用了这个命令:
ndk-build -C C:\Users\Thatisme\AndroidStudioProjects\DeezerAP2\app\src\main\jni
所有 *.c、*.h、*.mk 和 *.sh 都放在 jni 文件夹中,如下图所示。
EDIT3:我现在可以生成 *.so 文件,但由于某种原因,找不到本机方法。
EDIT4:
这就是我的项目的样子:
我手动复制了 jniLibs 文件夹中的 *.so 文件。
*.c 函数的声明好吗?
JNIEXPORT jobject JNICALL Java_com_lexample_liggy_ldeezerap_SerialPort_open
(JNIEnv *env, jclass thiz, jstring path, jint baudrate, jint flags)
EDIT5:我终于做到了。函数的正确名称是:
JNIEXPORT jobject JNICALL Java_com_example_iggy_deezerap_SerialPort_open
(JNIEnv *env, jclass thiz, jstring path, jint baudrate, jint flags)
Package name is: com.example.iggy.deezerap
Java file calling the function "open()" is: SerialPort
The source file containing the native function is named: SerialPort.c
The function beeing called is: open()
我重新编译了 *.c 文件,将它们也复制到 jniLibs 中,重新编译了 Android 项目,现在它可以工作了。
我很确定我以前有过这种情况,我强烈怀疑这是由于 *.c 函数中的某种不匹配错误造成的。
关于粗体中的内容:
JNIEXPORT 作业 JNICALL Java_com_example_iggy_deezerap_SerialPort_open (JNIEnv *env, jclass thiz, jstring path, jint baudrate, jint flags)
这是指 *.c 文件还是 *.java 文件?
【问题讨论】:
SerialPort 指定您的native open(...)
函数所在的 Java 类。
【参考方案1】:
您的 NDK 位于何处? ndk-build.cmd 必须直接在其目录中,否则您的 ndk 安装会损坏,您必须再次安装/解压。
【讨论】:
你说你现在可以编译你的 *.c 文件,你还有什么问题吗? 当然。我现在正在研究为什么实际上没有生成 *.so 文件。 现在您声明它们已生成但未找到本机方法。检查您的 .so 文件是否在 apk 中(在lib/%cpu_abi%
下),并且 proguard 没有重命名声明为 native 的类和方法。
生成的 *.so 放在 lib/%cpu_abi% 中,例如其中一个文件夹是 lib/armeabi。我有来自另一个项目的附加 *.so 文件,这些文件位于 jniLibs 中。为什么本机文件进入“lib”,其他进入“jniLibs”?
你说的是APK还是项目文件夹?您的所有库都必须位于相同的文件夹中:jniLibs
用于 Android Studio 项目文件夹内的库,lib
用于 APK 内的库,libs
用于 Eclipse 项目文件夹内的库。
【参考方案2】:
您是否正确设置了 NDK 的路径。检查 local.properties 文件并确保您已正确设置 NDK 的路径。
观看此视频,了解使用 Android Studio https://software.intel.com/en-us/videos/building-ndk-apps-with-android-studio 设置 NDK 的详细步骤
【讨论】:
【参考方案3】:尝试使用安卓 NDK_r9d。 就我而言,我使用 android NDK_r9d、apache ant 1.9.4、windows 64 位和 python 2.7.9。 它的工作完美。
【讨论】:
【参考方案4】:与 Android Studio 的完整 NDK 集成还没有完全实现。 NDK 现在与 Android SDK 捆绑在一起(在某种程度上),尽管它没有与 SDK 一起下载。一旦您下载了 Android Studio 和 SDK(我相信它们现在都集中在一个下载中),打开 Android Studio IDE 并找到“项目结构”对话框,然后找到“SDK 位置”面板。在那里您可以看到 NDK 的下载链接。 Android Studio 将 NDK 下载到 Android SDK 根目录下名为“ndk-bundle”的文件夹中。此外,您还需要阅读Android NDK Preview。祝你好运,因为 IDE 的构建系统、Gradle 和 Gradle 的不同插件与 Gradle 的系统版本不同(废话),这很复杂。
【讨论】:
【参考方案5】:你可以通过这些方式做到这一点。
一个。通过将export ANDROID_NDK='/Users/roofe/Documents/android-ndk-r14b'
添加到.bash_profile 来添加ANDROID_NDK 环境变量。然后使用 source ./.bash_profile
加载它。
b。将sdk.dir=/Users/roofe/Library/Android/sdk
添加到Android Studio的local.properties中。
c。 文件 > 项目结构
下载NDK或设置路径。
【讨论】:
【参考方案6】:如果有人路过,有一种解决方法,无需使用 Android Studio 重新下载 NDK。正如@BoiseBaked 指出的那样,Android Studio 将 Android NDK 存储在 Android SDK 根文件夹下名为“ndk-bundle”的文件夹中。因此,在 linux 中,只需在 SDK 根文件夹中创建一个指向 NDK 根文件夹的符号链接(如果使用 Windows,则为快捷方式)即可解决问题,如下所示:
ln -s [FULL_PATH_TO_NDK_ROOT] [FULL_PATH_TO_SDK_ROOT]/ndk-bundle
我相信在 Windows 中做类似的事情会奏效。
【讨论】:
以上是关于将 Android Studio 配置为使用 NDK(android-ndk-r10d,Windows 64 位)的主要内容,如果未能解决你的问题,请参考以下文章