NDKJniDemo

NDK-JNI开发入门教程

Stars
23

JNIJava Native InterfaceJava API Java C/C++Java JNI C/C++ C/C++ java Java C/C++ C/C++

NDKNative Development Kit C/C++

  • Android studio 3.1.2
  • gradle 4.4 plugin 3.1.2
  • targetSdkVersion 28

Jni

  • 1.Java
  • 2.Terminal.h
  • 3..c .cpp

1.NDK+CMake

  • NDK Android C C++
  • CMake Gradle ndk-build
PsCMake  AS 2.2 () JNI 

2.NDK

1.local.properties
ndk.dir=D\:\\workTime\\android-studio-sdk-2.3\\android-studio-sdk-2.3\\ndk-bundle
sdk.dir=D\:\\workTime\\android-studio-sdk-2.3\\android-studio-sdk-2.3

2.gradle.properties
#gradle:3.0.1  studio3.0 
android.useDeprecatedNdk=true
#gradle:3.0.1  studio3.0 
android.deprecatedNdkCompileLease=1511832698813

3.build.gradleCMake

android {
   .........
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

4.appCMakeLists.txt

CMakeLists.txtpath "CMakeLists.txt"

CMakeLists.txt

# CMake

# 1. CMake
cmake_minimum_required(VERSION 3.4.1)

# 2. add_library  , , 
add_library(
            # Sets the name of the library.
            JNIControl
            # Sets the library as a shared library.
            SHARED
            src/main/jni/JNIControl.cpp
)

# 3. find_library ()
find_library(
        log_lib # , 
        log     # liblog.soliblog.a
)

# 4. target_link_libraries
target_link_libraries(
     JNIControl  # add_library 
     ${log_lib} # find_library 
)
}

1..hjava

/**
 * <pre>
 *     author : Wp
 *     e-mail : [email protected]
 *     time   : 2018/11/15
 *     desc   :
 *     version: 1.0
 * </pre>
 */
public class JNIUtils {

    static {
         //JNIControl .c .cpp   
        System.loadLibrary("JNIControl");
    }

    public static native String printStringByJni();
}

2.Android studio Terminal

1.java
cd app/src/main/java
2.javajava.h
javah king.bird.ndkjnidemo.JNIUtils
3.mainjni.h
4. .h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class king_bird_ndkjnidemo_JNIUtils */

#ifndef _Included_king_bird_ndkjnidemo_JNIUtils
#define _Included_king_bird_ndkjnidemo_JNIUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     king_bird_ndkjnidemo_JNIUtils
 * Method:    printStringByJni
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_king_bird_ndkjnidemo_JNIUtils_printStringByJni
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif


3..c.cpp

JNIControl.cpp
#include "king_bird_ndkjnidemo_JNIUtils.h"
//king_bird_ndkjnidemo_JNIUtils_printStringByJni ++
JNIEXPORT jstring JNICALL Java_king_bird_ndkjnidemo_JNIUtils_printStringByJni
        (JNIEnv *env, jclass jclass){
    //
return env->NewStringUTF("JNI");
}

1.MainActivity
package king.bird.ndkjnidemo

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mBtnLoadNative.setOnClickListener {
            val jniUtils = JNIUtils.printStringByJni()
            mTvText.text = jniUtils
        }
    }
}

2.activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/mTvText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/mBtnLoadNative"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="LoadNativeText"
        app:layout_constraintTop_toBottomOf="@+id/mTvText"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        tools:ignore="HardcodedText" />
</android.support.constraint.ConstraintLayout>

  1. Fork
  2. Feat_xxx
  3. Pull Request

  • call me
  • QQ830556582
  • QQ1101313414

github