Android Studio 3.0以上配置NDK、调用C代码、生成so库

终于成功了55555555555



看了3篇文章才搞定,坑太多!!!!!!!

第一篇,配置ndk环境https://blog.csdn.net/u014651216/article/details/52410809

2.NDK安装与配置

  • 首先创建一个Android项目工程,File-->New-->New Project,一路下一步就好,最后finish创建完成项目.
  • 打开Project Structure,默认Android NDK location是没有的,这时候如果已经下载有了NDK,那你就可以直接选择下载好的NDK路径设置到输入框,否则点击download进行下载,下载完成后默认安装在sdk根目录,命名为ndk-bundle。 // 我的SDK地址为D:\android-sdk.

Project Structure
  • 添加系统环境变量,新建变量名ANDROID_NDK_HOME,对应变量值为ndk根目录地址 ,如D:\android-sdk\ndk-bundle,然后将ANDROID_NDK_HOME添加到Path中去(%ANDROID_NDK_HOME%;),确定OK.
  • 至此,会在项目的local.properties文件下添加ndk的目录地址,如果没有自动添加,可以收到加上一行:ndk.dir=D\:\android-sdk\ndk-bundle,由于ndk版本和IDE的版本可能存在不一致性,所以编译时会检查ndk的过时性,这个时候如果报警了,可以在gradle.properties文件下添加一行:android.useDeprecatedNdk=true.到此,NDK的安装和配置就完成.

第二篇https://blog.csdn.net/yanbober/article/details/45309049

在AS中新建一个Project,然后再新建一个class为NdkJniUtils,在内部声明native方法(jni使用的定义,后面系列教程会细说)。

package io.github.yanbober.ndkapplication;

public class NdkJniUtils {
    public native String getCLanguageString();
}

在工程主文件Activity中写入如下代码调运JNI的东西显示在UI上。

public class MainActivity extends ActionBarActivity {
    private TextView mTextView;

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

        mTextView = (TextView) this.findViewById(R.id.test);

        NdkJniUtils jni = new NdkJniUtils();

        mTextView.setText(jni.getCLanguageString());
    }
}

然后build project得到其中中间文件,我们关注的是.class文件。编译OK以后生成的class文件在AS工程的如下目录:

NDKApplication\app\build\intermediates\classes\debug

然后接下来的步骤就是根据生成的class文件,利用javah生成对应的 .h头文件。

点开AS的Terminal标签,默认进入到该项目的app文件夹下。我在windows平台下输入如下命令跳转到class中间文件生成路径:

xxxxx\app> cd build\intermediates\classes\debug

然后执行如下javah命令生成h文件。

xxxxx\debug> javah -jni io.github.yanbober.ndkapplication.NdkJniUtils

执行完之后你可以在文件夹NDKApplication\app\build\intermediates\classes\debug下看见生成的 .h头文件为:

io_github_yanbober_ndkapplication_NdkJniUtils.h

其内容为:

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

#ifndef _Included_io_github_yanbober_ndkapplication_NdkJniUtils
#define _Included_io_github_yanbober_ndkapplication_NdkJniUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     io_github_yanbober_ndkapplication_NdkJniUtils
 * Method:    getCLanguageString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_io_github_yanbober_ndkapplication_NdkJniUtils_getCLanguageString
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

在工程的main目录下新建一个名字为jni的目录,然后将刚才的 .h文件剪切过来。在jni目录下新建一个c文件,随意取名,我的叫jnitest.c 。然后编辑代码如下(后面会解释啥意思,这里重在工具使用):

#include "io_github_yanbober_ndkapplication_NdkJniUtils.h"
/*
 * Class:     io_github_yanbober_ndkapplication_NdkJniUtils
 * Method:    getCLanguageString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_io_github_yanbober_ndkapplication_NdkJniUtils_getCLanguageString
  (JNIEnv *env, jobject obj){
     return (*env)->NewStringUTF(env,"This just a test for Android Studio NDK JNI developer!");
  }

接下来在工程的local.properties文件中添加NDK路径(上面下载好的那个NDK),类似其中的SDK路径一样,我的添加后如下:

sdk.dir=D\:\\AndroidStdioSDK\\sdk
#add by 工匠若水
ndk.dir=D\:\\AndroidStdioSDK\\android-ndk-r10d-64bit

接下来在app module目录下的build.gradle中设置库文件名(生成的so文件名)。找到gradle文件的defaultConfig这项,在里面添加如下内容:

defaultConfig {
    ......
    ndk{
        moduleName "YanboberJniLibName"         //生成的so名字
        abiFilters "armeabi", "armeabi-v7a", "x86"  //输出指定三种abi体系结构下的so库。目前可有可无。
    }
}

现在生成的so库名字也有了,那就去代码的NdkJniUtils java文件添加静态初始化load代码,添加如下:

static {
        System.loadLibrary("YanboberJniLibName");   //defaultConfig.ndk.moduleName
    }

好了,到此AS下NDK JNI开发的代码编写和设置就OK了,接下来就是编译工程运行就可以了。

第三篇https://blog.csdn.net/xiaozhu0922/article/details/78835144(3.0前,上面两篇就可以了,3.0后还要加点东西)

先通过SDKManager下载:CMake和LLDB 
这里写图片描述
在build.gradle的defaultConfig节点下加入: 
// 使用Cmake工具 
externalNativeBuild { 
cmake { 
cppFlags “serial_port” 
//生成多个版本的so文件 
abiFilters ‘arm64-v8a’, ‘armeabi-v7a’ 


在build.gradle的android节点下加入: 
// 配置CMakeLists.txt路径 
externalNativeBuild { 
cmake { 
path “CMakeLists.txt” //编译后so文件的名字 


这里写图片描述

cmakelist文件如下

cmake_minimum_required(VERSION 3.4.1)
add_library(
cool
SHARED
src/main/jni/test.c)
find_library(
log-lib
log )
target_link_libraries(
cool
${log-lib} )
所有流程都搞定,接下见证奇迹: 

这里写图片描述


以上拼接的很不好,读者可能会有点被误导,但是凭借这3篇肯定可以弄出来。有啥bug直接留言。

猜你喜欢

转载自blog.csdn.net/qq_36523667/article/details/80093935