#标题:Android Studio 3.6.3 搭建NDK环境,并新建工程

=

背景:本人初次学习Android studio 上搭建NDK环境,按照很多博客方法搭建,最终不能生成.so文件,搞了整整一个下午,终于看到一篇博客,是在Android studio3.4平台搭建,按照该方法尝试成功。因此,写该博客记录一下。参考博文:https://www.cnblogs.com/xujunjia/p/11470622.html

注意:Android studio 得版本不同,NDK环境配置方式不同,因此在学习时一定确认自己得平台版本。该博文得平台为Android studio 3.6.3.

下面为正文,搭建NDK和创建工程得方式和参考博文基本一致,为了巩固一下流程及注意事项,在这里重新梳理一下。

第一步:打开Android studio平台,点击工具栏“SDKManager”按钮,选择“Android SDK”选项->“SDK Tools”标签,选中“LLDB”(用于JNI代码调试)、“CMake”(编译jni程序,生成.so文件)、“NDK”(NDK环境)。点击“OK”,开始下载。

注:下载文件到SDK根目录。我得路径为:E:\install\android-sdk

第二步:配置NDK。选择“FILe”->“Project Stucture”->“SDK Location”,“AndroidNDK Location”选择刚刚下载“ndk-bundle”路径。点击“Apply”按钮,点击“OK”。

此时查看配置文件“local.properties”中自动生成NDK配置路径。即NDK配置完成。

第三步:新建工程。选择“File”->“New”->"New Project"选择“***Native C++”模板。***依次“next”、“finish”,工程创建成功。新创建得工程中新增cpp文件夹,包含CMakeLists.txt及.cpp文件,说明该项目包含有C++编译环境。

同时,工程报错Caused by: org.gradle.api.InvalidUserDataException:
NDK not configured. Download it with SDK manager. Preferred NDK version is
‘20.0.5594570’. Log:
E:\project\ndk\test\MyApplication\app.cxx\ndk_locator_record.json

说明该工程无NDK环境,按照上述NDK配置方法,配置NDK环境。配置好环境后,工程目录新增.cxx文件夹,打开“ndk_locator_record.json”文件,可以看到NDK配置路径。说明ndk环境配置成功。

第四步:编写代码,生成.so文件。

1、在工程下新建类

选择提示信息,在native-lib.cpp文件中自动生成C++方法接口,补全实现方法。

#include #include extern "C" JNIEXPORT jstring JNICALLJava_com_example_myapplication_MainActivity_stringFromJNI(JNIEnv* env,jobject /* this */) {std::string hello = "Hello from C++";return env->NewStringUTF(hello.c_str());}extern "C"JNIEXPORT jstring JNICALLJava_com_example_myapplication_myjni_getHelloWord(JNIEnv *env, jobject thiz) {return env -> NewStringUTF("Hello every,this is my first jniproject");}

2、生成.h文件 (1)编译工程,在build路径下生成myjni类 …\build\intermediates\javac\debug\classes\com\example\myapplication\myjni.class
在Android studio控制台Terminal 定位到***main文件夹(定位到哪里生成得jni文件就在哪个路径)***下输入命令
javah -d jni -classpath classes路径 包名.类名,生成jni文件夹,生成.h文件。

此时,main文件夹下面新增“jni”文件夹包含.h文件。

3、.cpp文件夹添加.h文件得引用

#include #include #include "../jni/com_example_myapplication_myjni.h"extern "C" JNIEXPORT jstring JNICALLJava_com_example_myapplication_MainActivity_stringFromJNI(        JNIEnv* env,        jobject /* this */) {    std::string hello = "Hello from C++";    return env->NewStringUTF(hello.c_str());}extern "C"JNIEXPORT jstring JNICALLJava_com_example_myapplication_myjni_getHelloWord(JNIEnv *env, jobject thiz) {    return env -> NewStringUTF("Hello every,this is my first jni project");}

4、CMakeLists.txt文件配置

在这里插入代码片# For more information about using CMake with Android Studio, read the# documentation: https://d.android.com/studio/projects/add-native-code.html# Sets the minimum version of CMake required to build the native library.cmake_minimum_required(VERSION 3.4.1)# Creates and names a library, sets it as either STATIC# or SHARED, and provides the relative paths to its source code.# You can define multiple libraries, and CMake builds them for you.# Gradle automatically packages shared libraries with your APK.add_library( # Sets the name of the library.(生成.so文件名)             firstjni             # Sets the library as a shared library.             SHARED             # Provides a relative path to your source file(s)(生成.so对应得.cpp文件).             native-lib.cpp )# Searches for a specified prebuilt library and stores the path as a# variable. Because CMake includes system libraries in the search path by# default, you only need to specify the name of the public NDK library# you want to add. CMake verifies that the library exists before# completing its build.find_library( # Sets the name of the path variable.              log-lib              # Specifies the name of the NDK library that              # you want CMake to locate.              log )# Specifies libraries CMake should link to your target library. You# can link multiple libraries, such as libraries you define in this# build script, prebuilt third-party libraries, or system libraries.target_link_libraries( # Specifies the target library(生成.so文件得文件名).                       firstjni                       # Links the target library to the log library                       # included in the NDK.                       ${log-lib} )

5、新建Android调用.so文件。

package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView;public class MainActivity extends AppCompatActivity {    // Used to load the 'native-lib' library on application startup.    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // Example of a call to a native method        TextView tv = findViewById(R.id.sample_text);        tv.setText(new myjni().getHelloWord());    }}

6、模拟器编译。成功。

以上为Androidstudio3.6.3平台搭建NDK及创建native工程得全部内容。第一次写博文内容可能有点乱,请包含。下一边篇介绍在原有Android工程得基础上添加NDK 环境,编译nativity程序。
git地址:https://github.com/wildlily1989/androidndk

更多相关文章

  1. Android对第三方类库运行时加载
  2. Cocos2d-x for Android(2)--编译和新建工程
  3. android 按键映射***.kl文件中的WAKE和WAKE_DROPPED的定义
  4. Android源码分析之Framework的MediaPlayer
  5. Android(安卓)SDK Manager:failed to install
  6. Android(安卓)JNI 编译正确 但是提示程序有错误无法运行 而且还
  7. Android(安卓)Studio编译运行时 Local path doesn't exist.
  8. Android使用外部字体
  9. Android(安卓)Studio集成OpenCV

随机推荐

  1. clockworkmod CWM简单介绍
  2. 一个简单、漂亮、功能强大的Android日志
  3. 学最新最优秀的JAVA技术,就上广州传智播客
  4. Android瀛︿範锛堜竴锛塗extView,ImageView
  5. Android(安卓)ADT 14 插件更新说明
  6. Android ICS系统是支持通过互联网时间同
  7. Android线程与异步消息处理机制
  8. Android使用Bmob移动后端云Restful API需
  9. 谈谈对Android定时任务中AlarmManager的
  10. qq聊天界面七:表情的发送接收(用富文本现实