Android Studio 下利用c语言生成so文件并利用jni调用

**前言:**由于自己也是小白学习,网上这类教程比较杂乱无序,不太系统,踩了太多抗,由于最近忙于事情,仅记录下自己在Android Studio下生产so文件并成功调用的例子,过程多以图片显示,没时间码字,不足之处多见谅。

准备工作:
1、Android Studio 下载安装;
2、SDK、NDK、JRE安装与环境变量设置;
这是前期需要做的基本工作;以上教程很多,可自己寻优选择教程学习。

平台环境与工具版本:
1、ubuntu18.04LTS
2、Android Studio Arctic For | 2020.3.1

一、生成so

生成新工程:

aar android studio 调用 android studio 调用so_java


定义工程名:

aar android studio 调用 android studio 调用so_github_02


加NDK路径:

首先找到你“ndk-build"文件,右键属性,复制路径加在local.properties,如下图

aar android studio 调用 android studio 调用so_java_03


新建java文件:

在图示目录下new->java class 并取名(留意此名,与后续一致)

aar android studio 调用 android studio 调用so_java_04


加入代码:

package com.example.testjni3;

public class Jni3Test {
    static {
        System.loadLibrary("Jni3Test");
    }
    public static native String getJniTestString();
}

如下图

aar android studio 调用 android studio 调用so_Android_05

生成class文件

打开Terminal,cd到新建Jni3Test目录下并生产class文件

cd app/src/main/java/com/example/testjni3 
javac Jni3Test.java

如下图示

aar android studio 调用 android studio 调用so_android_06


生成class对应的头文件.h

cd到main下,执行,这里不得不说很抗——之前Android版本用的是javah ****,现在javah 被javac “吃了”。如下代码片及图示。

javac -h jni java/com/example/testjni3/Jni3Test.java

aar android studio 调用 android studio 调用so_android_07


jni文件夹下新建c文件

aar android studio 调用 android studio 调用so_Android_08


c文件中加入方法的实现代码

#include "jni.h"
#include "com_example_testjni3_Jni3Test.h"
JNIEXPORT jstring JNICALL Java_com_example_testjni3_Jni3Test_getJniTestString
   (JNIEnv *env, jclass jz)
  {
     return (*env)->NewStringUTF(env,"ly miss family and study Android jni");
   }

aar android studio 调用 android studio 调用so_android_09


新建Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Jni3Test
LOCAL_SRC_FILES := test.c
include $(BUILD_SHARED_LIBRARY)

aar android studio 调用 android studio 调用so_Android_10


新建Application.mk

APP_PLATFORM := android-16
APP_MODULES := Jni3Test
APP_ABI := all

aar android studio 调用 android studio 调用so_java_11


执行ndk-build生成so

注意:先cd到jni目录下如图Terminal显示

ndk-build

aar android studio 调用 android studio 调用so_java_12


二、第三方利用jni调用生成的so新建proj如图

aar android studio 调用 android studio 调用so_java_13


定义工程名

aar android studio 调用 android studio 调用so_github_14


接下来将全部so加入到新建工程的libs下,结构目录如下图;并在app下的build.gradle下加入如下代码

sourceSets {
        main{
            jniLibs.srcDirs=['libs']
        }

注意加的位置如图

aar android studio 调用 android studio 调用so_Android_15


将生成so时所用到的java层声明布局进来

具体:cd到example目录下执行mkdir testjni3生成同层文件夹。

在新建与前述同名java class 如图

aar android studio 调用 android studio 调用so_java_16


添加代码

package com.example.testjni;

public class JNITest {
        static {
            System.loadLibrary("JNITest");
        }
        public static native String getJniTestString();
}

注意:如下图报错,根据提示直接点击自动在native-lib中帮助我们生成对应的本地声明,native-lib可理解为桥梁链接作用吧?

aar android studio 调用 android studio 调用so_android_17


aar android studio 调用 android studio 调用so_java_18


在MainActivity中对应位置加入如下代码,查看是否调用成功,如图已经成功

import com.example.testjni.JNITest;
tv.setText(JNITest.getJniTestString());

aar android studio 调用 android studio 调用so_java_19