栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android NDK制作so库

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android NDK制作so库

序言:该篇文章记录Android studio怎么使用NDK制作so库过程

最开始用Android Studio 3点几的版本和2020年3月份最新版本的Android studio,配置的时候老是出一些无法解决的错误,搞的心态爆炸。最终选择Android 4.0版本
SDK Platforms:Android 6.0(API 23)
SDK Build-Tools: 27.0.3
NDK 版本:21.0.6113669

一. 配置NDK环境

(1)点击1处进行NDK下载,勾选3处可以查看NDK的具体版本号

(2)NDK下载后的位置
SDK位置在:D:ASSDK
NDK位置在:D:ASSDKndk,我这里下载21.0.6113669

(3)配置环境变量
a. 打开电脑控制面板---->系统和安全---->系统---->高级系统设置---->环境变量

b.在系统变量里点击新建,创建一个NDK的环境变量
变量名就自己定义了,我这里定义为NDK_PATH,变量值为NDK的下载路径

注意:NDK的路径为含有build等文件的根目录,另外,如果可能还存在版本的问题,最开始配置23这个版本,NDK配置还是失败。

c.配置Path变量,新建一个变量值,增加%NDK_PATH%

d.在cmd下输入ndk-build,说明ndk环境配置成功

二. Android studio下制作so库过程

1.AS下新建一个TEST工程,在创建后的工程下创建一个JNI类

JNI.java里内容(JNI类里包含一个返回类型为String类型的sayHello方法)

package com.example.test;

public class JNI {
    public static native String sayHello(); 
}

2.在main文件夹下创建一个jni文件夹,jni文件夹下包含一个Android.mk,一个头文件,和一个C源文件

3. 制作jni文件夹下的头文件
(1)点击Android studio File---->Settings---->Tools----->External Tools

(2)创建一个Javah的快捷工具

Program:  javah
Arguments:  -v -jni -d D:ASWORKTESTappsrcmainjni $FileClass$   //这里的路径指头文件的存放位置
Working directory: $SourcepathEntry$

(3)右击JNI.java这个文件,选择External Tools下的javah,会自动生成com_example_test_JNI.h
(4)自己在jni文件夹下创建一个c文件(我取名为jni.c),文件里的内容如下

#include "jni.h"
#include "com_example_test_JNI.h"

JNIEXPORT jstring JNICALL Java_com_example_test_JNI_sayHello(JNIEnv* env,jclass object){
    return (*env)->NewStringUTF(env,"测试 jni");
}

(5)在jni文件夹下创建Android.mk文件,文件内容如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
#so库的名称
LOCAL_MODULE := JNITest
#需要用到的原材料
LOCAL_SRC_FILES := jni.c
include $(BUILD_SHARED_LIBRARY)

4.配置build.gradle,在该文件下加上ndk这段内容

defaultConfig {
        applicationId "com.example.test"
        minSdkVersion 23
        targetSdkVersion 31
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        ndk{
            moduleName "JNITest"
            abiFilters "armeabi","armeabi-v7a","x86"
        }
    }

5.生成so库文件,在Android studio下打开Terminal,进入jni文件夹下,输入ndk-build,会在app->src->main->obj->local下生成so库文件


6.在main文件夹下创建jniLibs文件夹,将编译生成的.so库armeabi-v7a整个文件夹拷贝到jniLibs文件下
7.在java里调用.so文件
JNI.class包含so库

   package com.example.test;

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

MainActivity里调用sayHello函数

public class MainActivity extends AppCompatActivity {
    private TextView text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = findViewById(R.id.test);
        text.setText(new JNI().sayHello());
    }
}

结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/314386.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号