Android Studio NDK之——环境配置

起因:

c++工程师给了一份c++项目源码,没给说明文档,就丢一份源码压缩包要安卓嵌一层jni生成so库用,我该拿这份源码的哪些文件来用?


一脸懵逼.png
抱怨自己:

以前都是c++那边给so库和.h文件,直接用很方便,现在给源码自己搞,感觉自己就残废了


研究:

稍微了解ndk的小伙伴应该清楚,使用c++源码的方式有两种,一种是直接新建支持c++的AS项目;AS3.0版本是这种界面

AS3.3版本是这种界面.png

另一种当然是无命令行,纯界面配置的JNI,推荐链接:https://blog.csdn.net/chuhongcai/article/details/52558049
https://blog.csdn.net/ziyoutiankoong/article/details/79696279
然后呢???不管哪种都需要先配置一下环境
1.下载NDK
下载ndk1.png

此处是我已经下载过后自动配置好路径了,如果没下载过,红色文字地方会有download ndk ,点击下载即可
下载ndk2.png

2.设置那边下载LLDB和CMke(也可以省略步骤1,直接在2这边下载ndk)

3.都下载完了,配置NDK环境变量


环境变量1.png

然后启动cmd输入启动命令行,输入ndk-build,得到如下图所示即可


环境变量配置成功.png

4.新建一个demo项目ndkdemo来记录JNI开发流程
AS3.3版本是这种界面.png

AS3.0版本是勾选include c++界面

至此,项目成功跑起来,已经算是把ndk集成成功了

5.项目创建如果不是步骤4的方式,也没关系,打开gradle.properties文件,输入android.useDeprecatedDdk=true


image.png

然后自己再配置.cpp文件、CMakeList.txt、build.gradle文件等等就行了

鱿鱼我这边c方法太多,我自己的项目是选择使用jni界面配置方式,使用c++源码,生成so库然后调用方式,下面简单记录下笔记

直接找给源码的c++工程师问哪些文件是对so库生成有用到的,一个都不能落下

1.跟着上面链接或者自己找的文章配置好File->Setting->External tool上面三个javah 、ndk-build、ndk-build clean这三个命令。
2.整个demo目录格式如图,新建jni文件夹


新建Android.mk文件

其中MyLibrary为要生成的so库名称,生成之后即为libMyLibrary.so

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := MyLibrary
LOCAL_SRC_FILES =: MyLibrary.cpp
include $(BUILD_SHARED_LIBRARY)
新建Application.mk文件

其中MyLibrary为要生成的so库名称,生成之后即为libMyLibrary.so

APP_MODULES := MyLibrary
APP_ABI := all
新建MyNdk.class
public class MyNdk {
    public MyNdk(){
    //    static { //两种调用方式都行
        System.loadLibrary("MyLibrary");    
}
    //自己定义的方法 正常应该是c/c++对外开放的方法名称
    public native String getString();
    //自己定义的方法 正常应该是c/c++对外开放的方法名称
    public native String getMyString();
}
生成.h头文件,即com_keytop_ndkbuilddemo_MyNdk.h

根据图片操作自动生成以下代码

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_keytop_ndkbuilddemo_MyNdk */

#ifndef _Included_com_keytop_ndkbuilddemo_MyNdk
#define _Included_com_keytop_ndkbuilddemo_MyNdk
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_keytop_ndkbuilddemo_MyNdk
 * Method:    getString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_keytop_ndkbuilddemo_MyNdk_getString
  (JNIEnv *, jobject);

JNIEXPORT jstring JNICALL Java_com_keytop_ndkbuilddemo_MyNdk_getMyString
  (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
新建MyLibrary.cpp文件
#include "com_keytop_ndkbuilddemo_MyNdk.h"

JNIEXPORT jstring JNICALL Java_com_keytop_ndkbuilddemo_MyNdk_getString
  (JNIEnv * env, jobject obj){
   return (*env).NewStringUTF("This is mylibrary !!!");
  }
JNIEXPORT jstring JNICALL Java_com_keytop_ndkbuilddemo_MyNdk_getMyString
  (JNIEnv * env, jobject obj){
   return (*env).NewStringUTF("getMyString success !!!");
  }
app下面build.gradle文件下
android{
……
ndk{
            moduleName "MyLibrary"
        }
        sourceSets.main{
            jni.srcDirs = []
            jniLibs.srcDir "src/main/libs"
        }
}
最后一步,生成so库
代码调用
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyNdk myNdk = new MyNdk();
        TextView tv = (TextView) findViewById(R.id.tv);
        tv.setText( myNdk.getMyString());
    }
}

demo地址:https://gitee.com/dawnling/NdkBuildDemo

推荐阅读更多精彩内容