android ndk 编程总结

1.首先,as需要安装ndk,如图所示

android ndk 编程总结_第1张图片
image.png

2.下一步,在src/main 目录下创建jni文件夹

3.在项目的build.gradle中添加如下代码

···
android {
defaultConfig {
ndk{
moduleName "YanboberJniLibName" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。目前可有可无。
}
}
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['libs'] // <-- 你的.so库的实际路径
}
}
}
···
4.创建jni方法声明类,例如
···
package io.github.yanbober.ndkapplication;
public class NdkJniUtils {
public native String getCLanguageString();

static {
    System.loadLibrary("YanboberJniLibName");   //defaultConfig.ndk.moduleName
}

}
···
5.执行javah生成.h文件

执行javah的正确姿势:
进入app/src/main目录:cd app/src/main
执行javah命令:javah

javah -d jni -classpath ./Java io.github.yanbober.ndkapplication

-d jni 头文件生成到jni文件夹(当前在\app\src\main目录下,所以.h所在的目录为\app\src\main\jni )
-classpath ./java 指定去当前路径下java下寻找包名指定的类

6.编写对应的C文件,文件名任意取。C文件和前面生成的.h文件有较强的联系,这里给出一个示例:
jnitest.c
···

include "io_github_yanbober_ndkapplication_NdkJniUtils.h"

/*

  • Class: io_github_yanbober_ndkapplication_NdkJniUtils
  • Method: getCLanguageString
  • Signature: ()Ljava/lang/String;
    */
    JNIEXPORT jstring JNICALL Java_io_github_yanbober_ndkapplication_NdkJniUtils_getCLanguageString
    (JNIEnv env, jobject obj){
    return (
    env)->NewStringUTF(env,"This just a test for Android Studio NDK JNI developer!");
    }
    ···

io_github_yanbober_ndkapplication_NdkJniUtils.h

···
/* DO NOT EDIT THIS FILE - it is machine generated */

include

/* Header for class io_github_yanbober_ndkapplication_NdkJniUtils */

ifndef _Included_io_github_yanbober_ndkapplication_NdkJniUtils

define _Included_io_github_yanbober_ndkapplication_NdkJniUtils

ifdef __cplusplus

extern "C" {

endif

/*

  • Class: io_github_yanbober_ndkapplication_NdkJniUtils
  • Method: getCLanguageString
  • Signature: ()Ljava/lang/String;
    */
    JNIEXPORT jstring JNICALL Java_io_github_yanbober_ndkapplication_NdkJniUtils_getCLanguageString
    (JNIEnv *, jobject);

ifdef __cplusplus

}

endif

endif

···

7.编写Amdroid.mk文件,这里给出示例
···
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := YanboberJniLibName
LOCAL_SRC_FILES := jnitest.c
include $(BUILD_SHARED_LIBRARY)
···
其中
LOCAL_MODULE表示模块名称
LOCAL_SRC_FILES表示需要参与编译的源文件
除了这两个,其他照搬即可
8.编写Application.mk文件,这里给出示例
···
APP_ABI := armeabi
···
用作配置要编译的CPU架构平台的类型
9.将.h 、.c 、Android.mk、Application.mk文件都放入jni文件夹中
10.生成so文件
在jni的上一级目录,使用命令

ndk-build
即可在main目录下生成libs文件夹包含so文件,将其移动到app/libs目录下即可

最后附上原文链接
http://blog.csdn.net/qq_26819733/article/details/69061664

你可能感兴趣的:(android ndk 编程总结)