文章目录
1.环境搭建
下载好NDK的包,并且在Project Structure里指向这个本地目录。
2.AndroidStuido 3.0, 用原来的方式进行NDK开发。
这种方式就是之前的方式,现在网上很多文章也是这种方式。创建项目的时候不要勾选include c++
。具体流程如下。
2.1.写Jni Native方法文件
package ndk.zj.com.ndk_version_2.jni;
public class FootBallJni {
static {
System.loadLibrary("football-lib");
}
public native String ballInfoShow();
}
2.2.生成头文件
2.2.1.进入jni文件目录
cd D:\android\demo\ndkDemo\HelloNdk\app\src\main\java
2.2.2.javah 在上一级目录生成.h头文件
D:\android\demo\ndkDemo\HelloNdk\app\src\main\java>
javah -d ../jni ndk.zj.com.ndk_version_2.jni.FootBallJni
完成之后查看头文件:D:\android\demo\ndkDemo\HelloNdk\app\src\main\jni\ndk_zj_com_hellondk_HelloNdk.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ndk_zj_com_ndk_version_2_jni_FootBallJni */
#ifndef _Included_ndk_zj_com_ndk_version_2_jni_FootBallJni
#define _Included_ndk_zj_com_ndk_version_2_jni_FootBallJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: ndk_zj_com_ndk_version_2_jni_FootBallJni
* Method: ballInfoShow
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_ndk_zj_com_ndk_1version_12_jni_FootBallJni_ballInfoShow
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
2.3.编写c++文件
2.3.1.创建c++文件
这里我创建了一个名为cFootBall.cpp
的文件。
2.3.2.引入刚才生成的头文件
#include "#include "ndk_zj_com_ndk_version_2_jni_FootBallJni.h>""
2.3.3.编写cFootBall.cpp
去ndk_zj_com_ndk_version_2_jni_FootBallJni.h
文件内copy需要实现的方法并修改代码。
#include "ndk_zj_com_ndk_version_2_jni_FootBallJni.h"
/*
* Class: ndk_zj_com_ndk_version_2_jni_FootBallJni
* Method: ballInfoShow
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_ndk_zj_com_ndk_1version_12_jni_FootBallJni_ballInfoShow
(JNIEnv *env, jobject jobj){
return env->NewStringUTF("i am football");
}
2.4.编写cmakeList.txt
位置:D:\android\demo\ndk\ndk_version_2\app\CMakeLists.txt
cmake_minimum_required(VERSION 3.4.1)
add_library( # Specifies the name of the library.
# 这里是你so的名字。刚才在 MainActivity里面要引用的
football-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
#这里是刚才 创建的c++ 代码的名字
src/main/jni/cFootBall.cpp )
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 )
target_link_libraries( # Specifies the target library.
# 这里是你so的名字。刚才在 MainActivity里面要引用的 一样。
football-lib
# Links the target library to the log library
# included in the NDK.
${log-lib} )
2.5.修改配置文件
2.5.1.gradle.propertise 添加代码
android.useDeprerecatedNdk = true
2.5.2.app/build.gradle 添加代码
android {
defaultConfig {
......
ndk{
// moduleName "football-lib"
// abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a',
// 'arm64-v8a'
}
}
buildTypes {
......
// sourceSets {
// main {
// jni.srcDirs = []
// }
// }
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
2.6.运行截图
2.7.so库查看
3.AndroidStuido 3.0 include C++,新方法NDK开发
include C+=项目在As3.0上采用了更省事的方式开发。创建项目的时候勾选include c++
。具体步骤如下。
3.1.写Jni文件
这个跟之前开发NDK一个流程,我们需要事先定义好NDK接口。
package ndk.zj.com.ndk_version_3.jni;
public class BasketBallJni {
static {
System.loadLibrary("basketball-lib");
}
public native String ballInfoShow();
}
3.2.生成头文件
这一步生成头文件的目的是,比如让你写一个Cpp你总不能完全手写是吧,你需要再生成的头文件内copy一部分代码到cpp文件然后修改。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ndk_zj_com_ndk_version_3_jni_BasketBallJni */
#ifndef _Included_ndk_zj_com_ndk_version_3_jni_BasketBallJni
#define _Included_ndk_zj_com_ndk_version_3_jni_BasketBallJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: ndk_zj_com_ndk_version_3_jni_BasketBallJni
* Method: ballInfoShow
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_ndk_zj_com_ndk_1version_13_jni_BasketBallJni_ballInfoShow
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
3.3.写Cpp文件
注意位置放在和生成的c代码一个目录下。
#include <jni.h>
#include <string>
//#include <ndk_zj_com_ndk_version_3_jni_BasketBallJni.h> //这么写会有问题 编译不通过
extern "C" JNIEXPORT jstring JNICALL
Java_ndk_zj_com_ndk_1version_13_jni_BasketBallJni_ballInfoShow
(JNIEnv *env, jobject job){
std::string hello = "I am BasketBall...";
return env->NewStringUTF(hello.c_str());
}
3.4.写CmakeList
在原有的add_library
下方增加代码。
add_library( # Sets the name of the library.
basketball-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/basketball-lib.cpp )
3.5.调用
tv.setText(new BasketBallJni().ballInfoShow());
3.6.运行结果
3.7.查看生成的SO库
4.本文Demo
https://github.com/zj614android/ndk/tree/master/helloNdk
5.Thanks
https://blog.csdn.net/EthanCo/article/details/79875312
https://blog.csdn.net/wanghao200906/article/details/79153172