初识JNI

设置支持jni

在gradle.properties中添加

android.useDeprecatedNdk=true

在local.properties中添加

ndk.dir=NDK的路径

最后在app内build.gradle,在Android/defaultConfig下面添加ndk配置
moduleName表示编译出的so文件的名字
abiFilters abi接口

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.0"
    defaultConfig {
        applicationId "com.example.jnitest"
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        ndk{
            moduleName "JNIHello"
            abiFilters "armeabi-v7a", "x86"
            ldLibs "log"//实现__android_log_print
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    。。。
}

在文件中使用Log

#include 

#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "HelloTest_TAG", __VA_ARGS__))
 LOGI("hellotest_clazz 2\n");

新建java访问c层的接口类

创建一个Jni的工具类,并定义接口函数,函数关键字用native(static用不用均可)

package com.example.jnitest;
public class JniUtils {
    static {
        System.loadLibrary("JNIHello");
    }
    public static native String getHello();
}

生成头文件

"make-project"编译完成
生成头文件

cd app/build/intermediates/classes/debug/
javah com.example.jnitest.JniUtils

创建jni开发的文件夹

点击app文件夹,New → Folder → JNI Folder, 选择在main文件夹下即可,生成成功后main目录下会出现一个jni的文件夹
找到刚才生成到头文件,复制到jni文件夹下(记得关闭刚才使用的终端,否则无法复制)
头文件有了,现在在jni目录下创建一个C++文件用于开发使用,命名与头文件相同
编写C++文件中定义函数的代码

#include "com_example_jnitest_JniUtils.h"

JNIEXPORT jstring JNICALL Java_com_example_jnitest_JniUtils_getHello(JNIEnv *env, jclass clazz){
    return env->NewStringUTF("Hello World");
}

参考文章:https://www.jianshu.com/p/28d541d658db

你可能感兴趣的:(初识JNI)