美文网首页
Android Studio Jni开发

Android Studio Jni开发

作者: 牵着1只蜗牛去散步 | 来源:发表于2017-11-28 15:19 被阅读10次

    Android studio配置

    确保Android Studio安装下图中 sdk tools


    image

    1、自动配置ndk

    新建工程时勾选 Include C++ support ,ndk开发环境会自动配置好


    image

    2、手动配置ndk开发环境

    • 在工程main文件夹下创建cpp文件夹
    image
    • 在cpp文件下创建 CMakeLists.txt

    CMakeLists.txt中的内容如下:

    #设置最小的CMake编译版本,确保你能够顺利编译
    cmake_minimum_required(VERSION 3.4.1)
    
    #指定库名称,指定库是静态还是共享,并提供源代码的相对路径。
    #您可以通过添加多个add.library()命令定义多个库,CMake为您构建它们。
    #当您构建应用程序时,Gradle会自动使用您的APK打包共享库。
    
    add_library( #指定库的名称
                 helloJNI
    
                 #将该库设置为一个共享库
                 SHARED
    
                 #提供源文件的相对路径
                 com_yangc_jnicmarkapplication_JniUtils.cpp)
    
    # 将预构建库链接到你的本地库中,这里的意思是将log库链接到helloJNI库中
    target_link_libraries(helloJNI
                          android
                          log)
    
    • build.gradle中添加如下代码:

        android {
            compileSdkVersion 25
            buildToolsVersion "25.0.3"
            defaultConfig {
                ...
                externalNativeBuild {
                    cmake {
                        abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a'
                    }
                }
                
            }
            externalNativeBuild {
                cmake {
                    path "src/main/cpp/CMakeLists.txt"
                }
            }
        }
      

    至此,jni的开发环境已经配置好了,接下来定义native函数如下:

    public class JniUtils {
        /**
         cd app/build/intermediates/classes/debug/
         javah com.yangc.jnicmarkapplication.JniUtils
         */
        static {
            System.loadLibrary("helloJNI");
        }
        public static native String getStringFromJni();
    }
    

    接着编译工程,在确保build中生成JniUtils.class 如下图中1:

    image

    接下来使用javah在Terminal中生成头文件,命令如下:

    生成头文件命令

    cd app/build/intermediates/classes/debug/
    javah com.yangc.jnicmarkapplication.JniUtils
    

    生成结果如上图中2

    头文件拷贝的cpp文件夹下,同时创建cpp文件,就可以愉快的进行jni开发了。

    生成的头文件代码:

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class com_yangc_jnicmarkapplication_JniUtils */
    
    #ifndef _Included_com_yangc_jnicmarkapplication_JniUtils
    #define _Included_com_yangc_jnicmarkapplication_JniUtils
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_yangc_jnicmarkapplication_JniUtils
     * Method:    getStringFromJni
     * Signature: ()Ljava/lang/String;// 签名
     */
    JNIEXPORT jstring JNICALL Java_com_yangc_jnicmarkapplication_JniUtils_getStringFromJni
      (JNIEnv *, jclass);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

    cpp文件代码:

    #include "time.h"
    #include <unistd.h>
    #include "com_yangc_jnicmarkapplication_JniUtils.h"
    #include <android/log.h>
    #include <stdio.h>
    #include <sys/system_properties.h>
    #include <string>
    
    #define LOG_TAG "System.out"
    #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
    #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
    
    JNIEXPORT jstring JNICALL Java_com_yangc_jnicmarkapplication_JniUtils_getStringFromJni
            (JNIEnv *env, jclass clazz) {
        return env->NewStringUTF("Hello JNI with Android Studio and CMake!");
    }
    

    相关文章

      网友评论

          本文标题:Android Studio Jni开发

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