当前位置:   article > 正文

android NDK——搭建Android Studio的NDK环境_both android.ndkpath and ndk.dir in local.properti

both android.ndkpath and ndk.dir in local.properties are set

我用的是Android studio集成Android的NDK

首先先看一下大概步骤: 

  • 1,下载NDK
  • 2,NDK的环境搭建
  • 3,Demo实例之调用本地无参方法直接返回字符串
  • 4,通过javah命令获取到本地头文件
  • 5,生成jni文件夹。用于存放.h和.c文件
  • 6,创建并编写.c文件
  • 7,as中配置生成so文件的信息。
  • 8,解决so文件生成失败 
  • 9,结果演示

一:下载NDK

  1:NDK的下载我采用的是Android studio自带的ndk

然后在SDK中找到NDK,下载不用翻墙下载,直接下载就可以了。

2:配置as中ndk路径。如果ndk路径没有自动添加,则点击select即可。并在local.properties配置文件中检查是否正确配置路径。

如果是直接采用上面的方式下载,下面这个路径是自动会生成的用户不用在添加

3、设置as。将ndk版本差异检测过滤掉,要不然项目无法编译。添加:android.useDeprecatedNdk=true 

二:NDK的环境搭建

进入环境变量

新建系统变量NDK_ROOT并且把我们刚刚生成的ndk环境变量路径复制进去

(我的是C\:\\Users\\Administrator\\AppData\\Local\\Android\\Sdk\\ndk-bundle)根据Android studio中local.properties中的ndk.dir的路径写。上面也有对应的截图

然后在path中加上路径(或者也可以直接把NDK的路径直接写在path里面,这样就可以不用创建NDK_ROOT了)

dos下命令:ndk-build;出现以下信息说明配置成功 

如果还是显示不是本地命令的话就是环境没有配置对,如果重新配置一定要把dos窗口关掉然后在重新开启。

三、Demo实例之调用本地无参方法直接返回字符串

直接在layout中添加一个按钮Button控件,用于点击调用本地方法: 


二 在MainActivity中获取该控件并注册它的点击监听器

  1. Button java2C=findViewById(R.id.java2C);
  2. java2C.setOnClickListener(new View.OnClickListener() {
  3. @Override
  4. public void onClick(View v) {
  5. String result =new Java2CJNI().java2C();
  6. Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show();
  7. }
  8. });


三 创建Java2CJNI类及本地方法
在我们的包下直接创建一个Java2CJNI类,并在类里创建一个java2C的本地方法: 

  1. package com.boxin.forkliftserialport;
  2. public class Java2CJNI {
  3. static {
  4. System.loadLibrary("Java2C");
  5. }
  6. public native String java2C();
  7. }

四 通过javah命令获取到本地头文件

在项目根目录下,进入main->java目录,全选文件目录栏,直接输入cmd命令并按回车键进入docs命令,在命令中执行javah -jni com.boxin.forkliftserialport.Java2CJNI命令: (com.boxin.forkliftserialport是包名,需要根据自己的包名改变)

(注意:首先我们一定要先set存放我们刚刚创建Java2CJNI,java的路径,否则直接javah -jni com.boxin.forkliftserialport.Java2CJNI会出现找不到文件路径的错误)

生成了com.boxin.forkliftserialport.Java2CJNI.h文件。

五、生成jni文件夹。用于存放.h和.c文件 

然后把刚刚生成的com.boxin.forkliftserialport.Java2CJNI.h移动到该目录

六、创建并编写.c文件

将步骤四中生成的.h文件移动到jni文件夹下,并创建一个.c文件来写c代码

这里写图片描述

这里写图片描述

下面的类型选择.c类型

在Java2C文件中加入以下代码(包名要根据自己的更改)

  1. #include "com_boxin_forkliftserialport_Java2CJNI.h"
  2. JNIEXPORT jstring JNICALL Java_com_boxin_forkliftserialport_Java2CJNI_java2C(JNIEnv *env, jobject instance) {
  3. return (*env)->NewStringUTF(env,"I am from Native C .");
  4. }

七、as中配置生成so文件的信息。 
这里写图片描述

用Make Project 生成so文件,然后运行项目。 
这里写图片描述

八、解决so文件生成失败

本来想做到这里应该就可以生成so文件了,但是还是不行运行了项目还是没有生成而且一直出现提示;

Flag android.useDeprecatedNdk is no longer supported and will be removed in the next

最后只能继续研究了;

大概意思就是说:

  1. android.useDeprecatedNdk不再支持了
  2. 让使用CMake or ndk-build
  3. 然后还有链接

解决方法:

1、先通过SDKManager下载:CMake和LLDB

2、在build.gradle的defaultConfig节点下加入:

  1. externalNativeBuild {
  2. cmake {
  3. cppFlags ""
  4. abiFilters 'arm64-v8a','armeabi-v7a','x86','x86_64'
  5. }
  6. }

和在Android加上

  1. externalNativeBuild {
  2. cmake {
  3. path "CMakeLists.txt" // 设置所要编写的c源码位置,以及编译后so文件的名字
  4. }
  5. }

CMakeLists.txt文件是我们自己创建的txt文件。添加CMakeLists.txt文件到build.gradle文件同级目录下,

具体内容如下:

  1. # For more information about using CMake with Android Studio, read the
  2. # documentation: https://d.android.com/studio/projects/add-native-code.html
  3. # Sets the minimum version of CMake required to build the native library.
  4. #CMakeLists.txt
  5. cmake_minimum_required(VERSION 3.4.1)
  6. # Creates and names a library, sets it as either STATIC
  7. # or SHARED, and provides the relative paths to its source code.
  8. # You can define multiple libraries, and CMake builds them for you.
  9. # Gradle automatically packages shared libraries with your APK.
  10. add_library( # Sets the name of the library.
  11. # 设置so文件名称.
  12. Java2C
  13. # Sets the library as a shared library.
  14. SHARED
  15. # 设置这个so文件为共享.
  16. # Provides a relative path to your source file(s).
  17. # 设置这个so文件为共享.
  18. src/main/jni/Java2C.c)
  19. # Searches for a specified prebuilt library and stores the path as a
  20. # variable. Because CMake includes system libraries in the search path by
  21. # default, you only need to specify the name of the public NDK library
  22. # you want to add. CMake verifies that the library exists before
  23. # completing its build.
  24. find_library( # Sets the name of the path variable.
  25. log-lib
  26. # Specifies the name of the NDK library that
  27. # you want CMake to locate.
  28. log )
  29. # Specifies libraries CMake should link to your target library. You
  30. # can link multiple libraries, such as libraries you define in this
  31. # build script, prebuilt third-party libraries, or system libraries.
  32. target_link_libraries( # Specifies the target library.
  33. # 制定目标库.
  34. Java2C
  35. # Links the target library to the log library
  36. # included in the NDK.
  37. ${log-lib} )

下图中圈红色的我已经改了。使用者要根据自己生成的so文件的名称改变

最后重新运行项目终于生成了so文件了

九、结果演示

æ§è¡ç»æ

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/384062
推荐阅读
相关标签
  

闽ICP备14008679号