• Android APP JNI 编写


    • Android 的普通的 APP 编写好了之后。如果想调用 C++ 代码,步骤如下.

    • 在官网,下载 NDK, 一般最新的就可以, 下载完毕之后配置,配置如下 File -> Project Structure 里面:

      ![](https://img2020.cnblogs.com/blog/991711/202005/991711-20200512094150200-1509732925.png)
      * 这个路径不能有空格,有空格会报错,下载在官网上有下载。
      
    • 配置完毕之后,就可以添加 C++ 代码了。

    • 在源代码的 app/src 目录添加 CMakeLists.txt 文件,内容如下:

    # For more information about using CMake with Android Studio, read the
    # documentation: https://d.android.com/studio/projects/add-native-code.html
    
    # Sets the minimum version of CMake required to build the native library.
    # 设置cmake 的最小版本  一般系统自动生成
    cmake_minimum_required(VERSION 3.4.1)
    
    # Creates and names a library, sets it as either STATIC
    # or SHARED, and provides the relative paths to its source code.
    # You can define multiple libraries, and CMake builds them for you.
    # Gradle automatically packages shared libraries with your APK.
    
    add_library( # Sets the name of the library.
                 # 设置生成.so 的文件名
                 my_lib
    
                 # Sets the library as a shared library.
                 #设置库的类型  一种静态文件  STATIC .a   一种动态文件  SHARED .so
                 SHARED
    
                 # Provides a relative path to your source file(s).
                 # 需要编译的c/c++ 文件
                 src/main/cpp/main.cpp )
    
    # Searches for a specified prebuilt library and stores the path as a
    # variable. Because CMake includes system libraries in the search path by
    # default, you only need to specify the name of the public NDK library
    # you want to add. CMake verifies that the library exists before
    # completing its build.
    
    find_library( # Sets the name of the path variable.
                  log-lib
    
                  # Specifies the name of the NDK library that
                  # you want CMake to locate.
                  log )
    
    # Specifies libraries CMake should link to your target library. You
    # can link multiple libraries, such as libraries you define in this
    # build script, prebuilt third-party libraries, or system libraries.
    
    target_link_libraries( # Specifies the target library.
                           # 指定链接的目标库
                           my_lib
    
                           # Links the target library to the log library
                           # included in the NDK.
                           ${log-lib} )
    
    • 在 app/src/build.gradle 里面添加如下内容:

    android {
        compileSdkVersion 29
        buildToolsVersion "29.0.3"
    
        defaultConfig {
            applicationId "com.example.cmi_at154_test"
            minSdkVersion 25
            targetSdkVersion 29
            versionCode 1
            versionName "1.0"
    
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    
            externalNativeBuild {
                cmake {
                    cppFlags ""
                }
            }
        }
    
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    
        externalNativeBuild {
            cmake {
                path 'CMakeLists.txt'
            }
        }
    }
    
    • 在 app/src/main 里面添加 C++ 文件夹,如下:

    • main.cpp 内容如下:

    #include "jni.h"
    #include "android/log.h"
    
    extern "C"
    JNIEXPORT jint JNICALL
            Java_com_example_cmi_1at154_1test_MainActivity_ReturnCOM1Result
            (JNIEnv *env, jobject thiz) {
        return 1;
    }
    
    extern "C"
    JNIEXPORT jint JNICALL
    Java_com_example_cmi_1at154_1test_MainActivity_ReturnCOM2Result
            (JNIEnv *env, jobject thiz) {
        return 0;
    }
    
    extern "C"
    JNIEXPORT jint JNICALL
    Java_com_example_cmi_1at154_1test_MainActivity_ReturnCOM3Result
            (JNIEnv *env, jobject thiz) {
        return 1;
    }
    
    extern "C"
    JNIEXPORT jint JNICALL
    Java_com_example_cmi_1at154_1test_MainActivity_ReturnCOM4Result
            (JNIEnv *env, jobject thiz) {
        return 0;
    }
    
    extern "C"
    JNIEXPORT jint JNICALL
    Java_com_example_cmi_1at154_1test_MainActivity_ReturnUSBResult
            (JNIEnv *env, jobject thiz) {
        return 1;
    }
    
    extern "C"
    JNIEXPORT jint JNICALL
    Java_com_example_cmi_1at154_1test_MainActivity_ReturnGPSResult
            (JNIEnv *env, jobject thiz) {
        return 1;
    }
    
    extern "C"
    JNIEXPORT jint JNICALL
    Java_com_example_cmi_1at154_1test_MainActivity_ReturnWIFIResult
            (JNIEnv *env, jobject thiz) {
        return 0;
    }
    
    extern "C"
    JNIEXPORT jint JNICALL
    Java_com_example_cmi_1at154_1test_MainActivity_Return4GResult
            (JNIEnv *env, jobject thiz) {
        return 0;
    }
    
    • 现在在 Java 文件里面就可以调用这些 C++ 代码.

        static {
            System.loadLibrary("my_lib");
        }
    
        public native int ReturnCOM1Result();
        public native int ReturnCOM2Result();
        public native int ReturnCOM3Result();
        public native int ReturnCOM4Result();
        public native int ReturnGPSResult();
        public native int ReturnWIFIResult();
        public native int ReturnUSBResult();
        public native int Return4GResult();
    
  • 相关阅读:
    详解REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR
    HTTP Header 详解
    搜索引擎爬虫蜘蛛的useragent
    PHP防抓取数据curl 解决方法
    用curl抓取网站数据,仿造IP、防屏蔽终极强悍解决方式
    windows下 composer常见问题及处理
    Composer命令详解
    SSM框架之RestFul示例
    关于SpringMVC返回数据带斜杠字符串问题之解决方案
    js之radio应用实例
  • 原文地址:https://www.cnblogs.com/chenfulin5/p/12874369.html
Copyright © 2020-2023  润新知