android studio重装ndk,Android Studio NDK之——环境配置

起因:

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

8adf85732ca0

一脸懵逼.png

抱怨自己:

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

8adf85732ca0

研究:

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

8adf85732ca0

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

另一种当然是无命令行,纯界面配置的JNI,推荐链接:https://blog.csdn.net/chuhongcai/article/details/52558049

https://blog.csdn.net/ziyoutiankoong/article/details/79696279

然后呢???不管哪种都需要先配置一下环境

1.下载NDK

8adf85732ca0

下载ndk1.png

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

8adf85732ca0

下载ndk2.png

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

8adf85732ca0

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

8adf85732ca0

环境变量1.png

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

8adf85732ca0

环境变量配置成功.png

4.新建一个demo项目ndkdemo来记录JNI开发流程

8adf85732ca0

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

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

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

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

8adf85732ca0

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文件夹

8adf85732ca0

新建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

8adf85732ca0

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

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* 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 !!!");

}

8adf85732ca0

app下面build.gradle文件下

android{

……

ndk{

moduleName "MyLibrary"

}

sourceSets.main{

jni.srcDirs = []

jniLibs.srcDir "src/main/libs"

}

}

最后一步,生成so库

8adf85732ca0

8adf85732ca0

代码调用

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());

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值