初识JNI

作者: To_Be_Better | 来源:发表于2018-03-28 19:04 被阅读0次

    设置支持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 <android/log.h>
    
    #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

          本文链接:https://www.haomeiwen.com/subject/ndyrcftx.html