当前位置:主页 > 查看内容

android NDK开发解析

发布时间:2021-07-19 00:00| 位朋友查看

简介:在android开发中如果需要用到c/c代码,则需要用到ndk和jni ndk是一套原生的工具,可以帮助我们在android开发中使用c/c代码.jni(java native interface)java原生接口,规定了java和c/c交互的规则. 我把ndk开发分为三部分 1. java层代码 2. c/c代码 3. 将c/c代码……

在android开发中如果需要用到c/c++代码,则需要用到ndk和jni

ndk是一套原生的工具,可以帮助我们在android开发中使用c/c++代码.
jni(java native interface)java原生接口,规定了java和c/c++交互的规则.

我把ndk开发分为三部分

1. java层代码
2. c/c++代码
3. 将c/c++代码打包为so包(CMake或者ndk-build)

个人理解是java通过so包和so包里面的c/c++代码交互
**

一.java层代码

**

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toast.makeText(this,getName(),1).show();
    }
    //指认对应的库
    static {
        System.loadLibrary("myjni");
    }
    //声明对应库中要用到的方法
    private native String getName();
}

使用javah 来生成jni头文件
这里属实有很多坑啊 直接给出成功案例吧
在代码的src->main->java 的这个位置 执行代码

javah -classpath . -jni com.example.myapplication.MainActivity

在这里插入图片描述
在这里插入图片描述

二.c/c++代码

**
2.1 jni接口
jni:java native interface java本地接口,用来帮助c/c++对于java的方法,字段等的访问.获取,调用等(个人理解)
2.2.ndk静态注册的c代码
ndk的静态注册,java和c之间的匹配是通过c文件中的方法名来辨别的,例如如下的java中的代码
在这里插入图片描述

c端代码
在这里插入图片描述

2.2.1 其中jstring是方法的返回值类型
2.2.2 方法名中,com_example_myapplication对应的调用的java中的路径
2.2.3 后面的MainActivity对应的类名
2.2.4 最后的methons是在java层对native方法的方法名

ndk静态注册:c层通过Java_路径_类名_java层方法名的命名方法名来和java层的native方法进行匹配(这里的方法名和参数是从jni头文件中复制过来的)

三.生成so文件

这里使用的是ndk-build的方法,需要配置两个文件Android.mk和Application.mk 在c代码同级目录创建Android.mk和Application.mk文件

4.1 Android.mk
Android.mk文件是一个负责向NDK构建系统描述NDK项目的GNU Makefile片段,是每一个NDK项目的必备组件,根据GNU Make的命名规则,变量名要大写

# Android.mk必须以LOCAL_PATH开头,注释#除外
# 设置工作目录,而my-dir则会返回Android.mk文件所在的目录
LOCAL_PATH := $(call my-dir)
 
# 借助CLEAR_VARS变量清除除LOCAL_PATH外的所有LOCAL_<name>变量
include $(CLEAR_VARS)
 
# 设置模块的名称,即编译出来.so文件名
# 注,要和java代码中的system.loadlibrary中的名称相同
LOCAL_MODULE := myjni  
 
# 指定参与模块编译的C/C++源文件列表,多文件用"\"隔开
LOCAL_SRC_FILES := jj.c
 
 
# 必须在文件结尾定义编译类型,指定生成的静态库或者共享库在运行时依赖的共享库模块列表。
# BUILD_SHARED_LIBRARY 共享库,供java或者其他共享库调用
# BUILD_STATIC_LIBRARY 静态库,供共享库调用,不能直接被java调用
include $(BUILD_SHARED_LIBRARY)

这里要修改的就是LOCAL_MODULE和LOCAL_SE_FILES 其他的不用改

4.2 Application.mk
Application.mk文件配置编译平台相关的内容
现在大部分的手机cpu都是armeabi-v7a 一般模拟器使用的是x86

# 最常用的APP_ABI字段:指定需要基于哪些CPU平台的.so文件
# 常见的平台有armeabi x86 mips,其中移动设备主要是armeabi平台
# 默认情况下,Android平台会生成所有平台的.so文件,即同APP_ABI := armeabi x86 mips
# 指定CPU平台类型后,就只会生成该平台的.so文件,即上述语句只会生成armeabi平台的.so文件
# APP_ABI := armeabi armeabi-v7a mips x86
APP_ABI := all
APP_PLATFORM := android-23

在当前目录打开命令窗口,执行ndk-build 即生成so文件

**

四.配置项目并运行

**
将在第三步生成的so文件放入src同目录的libs中并在model的build.gradle中配置

android{
	...
	sourceSets {
	        main() {
	            jniLibs.srcDirs = ['libs']
	        }
	    }
    }
    dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    ......
}

配置完成后即可运行

;原文链接:https://blog.csdn.net/weixin_41722852/article/details/115681532
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐