最終更新:2018-12-13 (木) 14:46:36 (1967d)  

Android Studio/プロジェクト/NDK

テンプレートの差分

Android Studio/プロジェクト/app/build.gradle

  • android {
        compileSdkVersion 25
        buildToolsVersion "25.0.2"
        defaultConfig {
            applicationId "com.example.test.myapplication"
            minSdkVersion 15
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    +        externalNativeBuild {
    +            cmake {
    +                cppFlags ""
    +            }
    +        }
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    +    externalNativeBuild {
    +        cmake {
    +            path "CMakeLists.txt"
    +        }
    +    }
    }
  • externalNativeBuild

Android Studio/プロジェクト/app/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_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.
                 native-lib
    
                 # Sets the library as a shared library.
                 SHARED
    
                 # Provides a relative path to your source file(s).
                 src/main/cpp/native-lib.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.
                           native-lib
    
                           # Links the target library to the log library
                           # included in the NDK.
                           ${log-lib} )
  • add_library
  • find_library
  • target_link_libraries

Android Studio/プロジェクト/app/src/main/cpp/native-lib.cpp

  • #include <jni.h>
    #include <string>
    
    extern "C"
    JNIEXPORT jstring JNICALL
    Java_com_example_test_myapplication_MainActivity_stringFromJNI(
            JNIEnv *env,
            jobject /* this */) {
        std::string hello = "Hello from C++";
        return env->NewStringUTF(hello.c_str());
    }
  • JNI
  • JNICALL?
  • JNIEXPORT

Android Studio/プロジェクト/app/src/main/java/com/example/test/myapplication/MainActivity.java

  • package com.example.test.myapplication;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    +import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
    +    // Used to load the 'native-lib' library on application startup.
    +    static {
    +        System.loadLibrary("native-lib");
    +    }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    +        // Example of a call to a native method
    +        TextView tv = (TextView) findViewById(R.id.sample_text);
    +        tv.setText(stringFromJNI());
        }
    
    +    /**
    +     * A native method that is implemented by the 'native-lib' native library,
    +     * which is packaged with this application.
    +     */
    +    public native String stringFromJNI();
    }
    
  • native
  • System.loadLibrary