Android Studio NDK之——环境配置

Android Studio NDK之——环境配置

筱宓dawnLing关注

0.7022019.03.31 21:46:00字数 523阅读 39,863

起因:

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值