将 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 位)的主要内容,如果未能解决你的问题,请参考以下文章

如何在android studio中建立一个html文件

android studio安装和配置kotlin

在 android studio 中使用二维数组

android studio 如何将git 得到最新的版本

android studio怎么配置svn忽略文件

升级Android Studio 3.1.2后,ProGuard配置解析器出错?