详解sh ndk-build.cmd command not found

举报
皮牙子抓饭 发表于 2024/04/03 09:57:12 2024/04/03
【摘要】 详解sh ndk-build.cmd command not found在Android NDK开发中,有时候会遇到一个常见的错误:sh ndk-build.cmd command not found。这个错误通常出现在使用Windows操作系统进行NDK编译时。问题描述一般来说,当我们使用NDK进行Android原生代码的编译时,需要在命令行中使用ndk-build来执行编译操作。然而,在...

详解sh ndk-build.cmd command not found

在Android NDK开发中,有时候会遇到一个常见的错误:sh ndk-build.cmd command not found。这个错误通常出现在使用Windows操作系统进行NDK编译时。

问题描述

一般来说,当我们使用NDK进行Android原生代码的编译时,需要在命令行中使用ndk-build来执行编译操作。然而,在Windows系统中,当我们执行ndk-build命令时,可能会遇到以下错误信息:

plaintextCopy code
sh ndk-build.cmd command not found

这个错误通常是由于系统找不到sh命令导致的。

原因分析

当我们执行ndk-build命令时,实际上是在调用一个名为ndk-build.cmd的批处理脚本。在这个脚本中,会用到sh命令来执行一些Shell脚本命令。然而,Windows系统并不提供原生的sh命令,因此会导致上述错误。

解决方法

为了解决sh ndk-build.cmd command not found错误,我们需要手动创建一个名为sh的批处理脚本,并将其加入系统的环境变量中。 以下是解决方法的具体步骤:

  1. 打开文本编辑器,创建一个新的文本文件。
  2. 在文本文件中输入以下内容:
batCopy code
@echo off
@"%ProgramFiles%\Git\bin\sh.exe" --login -i %*

注意:以上内容假设你已经安装了Git软件,并且Git的安装路径为C:\Program Files\Git\。如果你的Git安装路径不同,请相应修改脚本中%ProgramFiles%\Git\bin\sh.exe的部分。 3. 将文件保存为sh.bat(注意后缀是.bat)。 4. 将sh.bat文件移动到任意一个你希望存放系统环境变量的目录。例如,可以将它放在C:\Program Files\Git\下。 5. 打开系统环境变量设置:

  • 右键点击“我的电脑”(或“此电脑”),并选择“属性”。
  • 在打开的窗口中,点击“高级系统设置”。
  • 在新窗口中,点击“环境变量”按钮。
  1. 在“系统变量”下找到名为Path的变量,双击打开。
  2. 在“编辑环境变量”窗口中,点击“新建”按钮。
  3. 在弹出的窗口中,输入刚才移动的sh.bat文件的路径(例如C:\Program Files\Git\sh.bat)。
  4. 点击“确定”按钮保存设置,并关闭所有打开的窗口。
  5. 重新启动你的命令行窗口(例如cmd或PowerShell)。 现在,当你执行ndk-build命令时,系统将能够正确找到sh命令,并成功执行编译操作,而不再出现sh ndk-build.cmd command not found错误。


下面是一个示例代码,展示了如何使用OpenCV库在Android应用中实现图像的灰度化处理:

javaCopy code
// MainActivity.java
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.widget.ImageView;
public class MainActivity extends Activity {
    private ImageView imageView;
    
    private BaseLoaderCallback loaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            if (status == LoaderCallbackInterface.SUCCESS) {
                processImage();
            } else {
                super.onManagerConnected(status);
            }
        }
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        imageView = findViewById(R.id.imageView);
        
        if (!OpenCVLoader.initDebug()) {
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_4_0, this, loaderCallback);
        } else {
            loaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
    }
    
    private void processImage() {
        // 读取图像文件
        Bitmap bitmap = BitmapUtils.loadBitmapFromFile("input_image.jpg");
        
        // 将Bitmap转换为OpenCV的Mat对象
        Mat srcMat = new Mat(bitmap.getHeight(), bitmap.getWidth(), CvType.CV_8UC4);
        Utils.bitmapToMat(bitmap, srcMat);
        
        // 将图像转换为灰度图
        Mat grayMat = new Mat();
        Imgproc.cvtColor(srcMat, grayMat, Imgproc.COLOR_RGBA2GRAY);
        
        // 将灰度图转换为Bitmap
        Bitmap resultBitmap = Bitmap.createBitmap(grayMat.cols(), grayMat.rows(), Bitmap.Config.ARGB_8888);
        Utils.matToBitmap(grayMat, resultBitmap);
        
        // 显示处理后的图像
        imageView.setImageBitmap(resultBitmap);
    }
}

在上述示例代码中,我们首先需要在AndroidManifest.xml文件中添加相应的权限和配置项配置OpenCV库的使用。然后,在MainActivity类中,我们使用BaseLoaderCallback回调来确保OpenCV库已成功加载。一旦库加载完成,我们调用processImage()方法来进行图像处理。 在processImage()方法中,我们首先使用BitmapUtils工具类从文件中加载图像文件。然后,我们将Bitmap转换为OpenCV的Mat对象。接着,我们使用OpenCV的Imgproc类中的cvtColor()方法将图像从RGBA格式转换为灰度图。


ndk-build.cmd 是用于执行 Android NDK(Native Development Kit)构建操作的命令行工具。NDK 是一个工具集,允许开发者使用 C 和 C++ 编写与 Android 平台交互的本地(native)代码,例如使用 C/C++ 库进行图像处理、音频处理、物理模拟等。ndk-build.cmd 是其中一个执行构建操作的命令行脚本。 以下是 ndk-build.cmd 的一些重要功能和用法:

  1. CMake 构建系统支持: 从 Android NDK r14 开始,Google 推荐使用 CMake 构建本地代码工程。ndk-build.cmd 可以与基于 CMake 构建系统的项目一起使用,并支持基于 Android.mk 和 Application.mk 构建文件的旧版 Makefile 构建系统。
  2. 构建配置文件(Android.mk 和 Application.mk): ndk-build.cmd 会根据配置文件(Android.mk 和 Application.mk)中的设置来构建本地代码。Android.mk 是一个 Makefile 脚本,用于指定构建规则、源文件、依赖项等。Application.mk 则用于指定全局的构建配置选项。这些配置文件可以指定库的名称、构建类型、编译标志、链接选项等。
  3. 自动化构建过程: ndk-build.cmd 会自动编译代码、链接库、生成可执行文件等。它会在指定的构建目录中生成所需的库文件和可执行文件。默认情况下,ndk-build.cmd 会构建所有配置文件中指定的模块,并生成对应的库文件。
  4. 支持多平台的交叉编译: ndk-build.cmd 支持交叉编译,使得开发者可以在一个平台上编写和调试本地代码,然后将其移植到其他平台。通过配置文件中的 APP_ABI 参数,开发者可以指定要构建的目标平台架构(如armeabi-v7a、arm64-v8a、x86、x86_64等)。
  5. 支持自定义构建规则: ndk-build.cmd 允许开发者自定义构建规则。可以通过在构建文件中定义变量来指定自定义规则,以在构建过程中执行特定任务(例如执行脚本、复制文件等)。这样可以实现更复杂的构建操作和工作流程。

总结

通过手动创建sh批处理脚本并将其加入系统环境变量,我们可以解决在Windows系统下使用NDK编译时出现的sh ndk-build.cmd command not found错误。这个错误通常是由于系统找不到sh命令导致的。通过按照上述步骤进行操作,你应该能够成功解决这个问题,并顺利进行NDK开发。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。