zoukankan      html  css  js  c++  java
  • 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();
    
  • 相关阅读:
    leetcode 122. Best Time to Buy and Sell Stock II
    leetcode 121. Best Time to Buy and Sell Stock
    python 集合(set)和字典(dictionary)的用法解析
    leetcode 53. Maximum Subarray
    leetcode 202. Happy Number
    leetcode 136.Single Number
    leetcode 703. Kth Largest Element in a Stream & c++ priority_queue & minHeap/maxHeap
    [leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree
    正则表达式
    十种排序算法
  • 原文地址:https://www.cnblogs.com/chenfulin5/p/12874369.html
Copyright © 2011-2022 走看看