NDK-JNI开发入门教程
JNIJava Native InterfaceJava API Java C/C++Java JNI C/C++ C/C++ java Java C/C++ C/C++
NDKNative Development Kit C/C++
PsCMake AS 2.2 () JNI
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
#gradle:3.0.1 studio3.0
android.useDeprecatedNdk=true
#gradle:3.0.1 studio3.0
android.deprecatedNdkCompileLease=1511832698813
android {
.........
externalNativeBuild {
cmake {
path "CMakeLists.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
)
}
/**
* <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();
}
cd app/src/main/java
javah king.bird.ndkjnidemo.JNIUtils
/* 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
#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");
}
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
}
}
}
<?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>