android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)

本项目需要安装android studio 以及设定相应环境变量,请查看上一个博客。

1.新建New ->New Project 选择Empty Activity 点击Next 。       

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第1张图片

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第2张图片

2.项目名为T613_IIC(根据个人项目,设定名称) 。 

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第3张图片

 3.点击app 框,选择虚拟设备,虚拟设备出现helloworld 说明运行正常,否则环境没有设定好,重新检查设定。 

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第4张图片

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第5张图片

  4.为了产生.so库,先新建一个含有Native 方法的Java类。

     1)右击com.examples.t613_iic->New->Java ,新建t613_correction.java文件。

     2)在文件中,添加Native 方法,T613_algorithm就是要加载的.so 库名称。

     3)点击MainActivity ,调用Native 方法。

package com.example.t613_iic;

public class t613_correction {
    // 动态导入 so 库
    static {
        System.loadLibrary("T613_algorithm");
    }
    //创建一个 native 方法
    public native static String get();
}
package com.example.t613_iic;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("Message",t613_correction.get());
    }
}

 

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第6张图片

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第7张图片

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第8张图片

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第9张图片

 5.点击Make Project 会在路径:

T613_IIC\app\build\intermediates\javac\debug\compileDebugJavaWithJavac\classes\com\example\t613_iic 下产生

t613_correction.class文件。

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第10张图片

  6.生成JNI 的.h头文件。

 1)点击studio 底部的Terminal 进入终端,切入到main 目录下。

 2)执行

javac  -encoding  utf8  -h .\jni E:\Lightning2\android\app\T613_IIC\app\src\main\java\com\example\t613_iic\

t613_correction.java  命令,该命令表示在当前目录下生成jni 文件夹,并且产生 t613_correction.java的本地库的头文件。

3)在路径 T613_IIC\app\src\main\jni 下可以看到com_example_t613_iic_t613_correction.h头文件。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_example_t613_iic_t613_correction */

#ifndef _Included_com_example_t613_iic_t613_correction
#define _Included_com_example_t613_iic_t613_correction
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_t613_iic_t613_correction
 * Method:    get
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_t613_1iic_t613_1correction_get
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

 

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第11张图片

  7.新建auto_correction.c 库文件

1)右击jni->New->C/C++ Source File 。

2).c内容包含步骤 6 中产生的头文件,并且将头文件中Native 方法放入其中(从这里面大家应该能看到我们要封装成.so的C库    函数名和我们步骤 4 中创建的Native 方法的名称已经联系起来了,这就是JNI 的作用,将java 和c/c++ 建立一种转换机制)。

//
// Created by terawins on 2019/7/5.
//
#include
#include
//导入我们创建的头文件
#include "com_example_t613_iic_t613_correction.h"

JNIEXPORT jstring JNICALL Java_com_example_t613_1iic_t613_1correction_get
  (JNIEnv *env, jclass jclass){

      //返回一个字符串
      return (*env)->NewStringUTF(env,"This is my first NDK Application,my name is navy");
  }

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第12张图片

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第13张图片

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第14张图片

 

  8.新建Android.mk文件

     1)右击jni->New->File 。

      2)为auto_correction.c 编写.mk文件。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := T613_algorithm
LOCAL_LDFLAGS := -Wl,--build-id
LOCAL_SRC_FILES := E:\Lightning2\android\app\T613_IIC\app\src\main\jni\auto_correction.c

LOCAL_C_INCLUDES += E:\Lightning2\android\app\T613_IIC\app\src\debug\jni
LOCAL_C_INCLUDES += E:\Lightning2\android\app\T613_IIC\app\src\main\jni

include $(BUILD_SHARED_LIBRARY)

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第15张图片

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第16张图片

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第17张图片

  9.修改build.gradle 自动生成.so库 (该步骤也可以通过Terminal 下在jni 目录使用ndk-build 命令手动生成.so库,不再详述)

      1)点击build.gradle 增加ndk 编译命令 。

      2)右击Android.mk->Link C++ Project with Gradle ,弹出Link C++ Project with Gradle 对话框,选择ndk-build以及Android.mk 路径,点击OK ,将会在build.gradle中生成 externalNativeBuild 代码段。

        ndk{
            moduleName "T613_algorithm"         //生成的so名字
            abiFilters "armeabi-v7a", "x86"     //不同体系架构下的so库。
        }
    externalNativeBuild {
        ndkBuild {
            path file('src/main/jni/Android.mk')
        }
    }

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第18张图片

 

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第19张图片

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第20张图片

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第21张图片

  10.点击点击app 框,将看到.so库中的This is my first NDK Application,my name is navy 这句话被打印,运行虚拟机,可以看           到  T613_IIC 已运行。

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第22张图片

11. 在目录:E:\Lightning2\android\app\T613_IIC\app\build\intermediates\ndkBuild\debug\obj\local\armeabi-v7a 和

E:\Lightning2\android\app\T613_IIC\app\build\intermediates\ndkBuild\debug\obj\local\x86 下查看不同架构使用的.so库。

android studio 3.4.1 版 NDK 自动编译产生第三方.so 库(一)_第23张图片

 

注意事项:(1)t613_correction.c 加载的库的名称T613_algorithm和build.gradle 中ndk 代码段中生成.so库名称T613_algorithm以及 Android.mk 中LOCAL_MODULE := T613_algorithm 名称要一致。

 

 

 

你可能感兴趣的:(android,studio,3.4.1,java,NDK,ndk-build,第三方c/c++库,.so,android)