Android Studio 中开发 JNI 的方法记录

本文介绍了在Android Studio中使用CMake和ndk-build两种方法来开发JNI的基本步骤。通过CMake,可以在创建支持C++的项目时快速实现本地方法的声明与实现。而通过ndk-build,则需要更详细的配置过程,包括创建必要的文件夹结构、生成并实现头文件、编写编译脚本等。
摘要由CSDN通过智能技术生成

#Android Studio 中开发 JNI 的方法记录
https://www.jianshu.com/p/87ce6f565d37此系列文章不错,推荐
从网上看到基本上有两种发法:
-1、Cmake
-2、ndk-build

CMake

在新建android studio工程的时候勾选上支持c++后,在完成创建后,android studio会自动构建出cpp目录与Java同级;
图一
其中的c/cpp文件即是默认的C层的native方法的实现;

我们可以看到Java文件中有load 库以及对本地方法的声明;

我们可以看到Java文件中有load 库以及对本地方法的声明;如果你需要添加自己的native方法,只需要在Java文件中进行声明后,AS会自动在cpp中生成对应的native函数,你只需要在cpp函数中实现你的函数功能就ok了;
添加自己的方法
实现函数功能
如果要自己新增cpp文件,也想编译到lib库中,那么需要对CMakeLists.txt文件做些改动,把自己新增的文件路径添加到add_library中,如下图;当然也可以参考此修改,编译出自定义的新的.so库也是可以的。
新增文件的编译
这个是比较快捷和方便的。
如果想给之前的AS工程或者没有勾选C++支持的工程添加JNI支持,可以采用下面的ndk-build的方法;
##NDK-Build
此方法稍微复杂些,需要自己做一些配置,并且编写mk编译文件;
一般的流程是
1、在project->app->main下创建一个jni文件夹,在jin下创建include和src两个文件夹和Android.mk文件;
这里写图片描述
2、在Java类中声明需要调用的native方法,并且加载lib库;

.....
public class MainActivity extends AppCompatActivity {
    static {
        System.loadLibrary("NdkBuildTest");
    }
    ......
    public native String getString();
}

3、Java类中声明好native方法后,需要使用javah命令便捷地生成jni层的头文件.h,然后在.c文件中实现.h文件中的方法;可以使用AS的终端命令窗口,进入到main路径下使用
javah -d jni/include -classpath java/xxx.java
在java10之后,javah去除了,可以使用如下命令生成头文件:
javac -h jni/inlcude java/xxx/xxx/xxx.java
即javac -h 目标路径 源java文件格式
会在include下生成.h文件;然后在src中添加.c文件实现.h文件中的函数;

4、编辑Android.mk文件,需要了解make编译语言,手动编辑编译命令;

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

LOCAL_ARM_MODE :arm

LOCAL_C_INCLUDES += $(LOCAL_PATH)/include \
                    $(LOCAL_PATH)/src \
                    $(JNI_H_INCLUDE)

LOCAL_SRC_FILES := src/com_example_myapplication_NdkBuildTest.c
LOCAL_MODULE := libNdkBuildTest
LOCAL_PRELINK_MODULE := false

LOCAL_LDFLAGS += -L$(LOCAL_PATH)
LOCAL_LDLIBS :=-llog

include $(BUILD_SHARED_LIBRARY)

5、配置build.gradle,需要将ndk-build配置到构建文件中;

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        ndk{
            abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
        }//这里我们声明我们需要编译出的so库支持的架构包
    }
    externalNativeBuild{
        ndkBuild{
            path "src/main/jni/Android.mk"
        }//这里我们需要指明编译文件的路径
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

完成后,就可以重新构建工程,进行测试了。

这里有个关于make编译的网址,http://android.mk/ 可以有时间学习下编译原理及make编译语言的写法。

在源码中我们可以采用:
javac xxx.java -d bin/
javah -classpath bin com.xx.xx
生成头文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潇潇独行侠

如果有帮助到您,可以请杯快乐水

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值