ndk编译生成so

ndk-build编译生成so库

本文讲述使用Android 的ndk-build来编译生成so库,在命令行中编译。编译后的so库可以调用。
环境问题略过,请自行百度或谷歌安装ndk。

建立java文件

新建文件夹/cn/scnu
并在文件夹中创建java 文件:

package cn.scnu;
public class MainActivity{
    public native int num();
}

编译java文件

javac cn/scnu/MainActivity.java -d build

该命令会编译java文件并在build目录下生成,然后我们打开build目录

cd build/

javah生成头文件

然后我们使用javah命令:

javah cn.scnu.MainActivity // 注意这里是英文句号而不是/,简单的说就是javah+包名+类名

然后会生成一个.h头文件,我们打开这个头文件看看:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class cn_scnu_MainActivity */

#ifndef _Included_cn_scnu_MainActivity
#define _Included_cn_scnu_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     cn_scnu_MainActivity
 * Method:    num
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_cn_scnu_MainActivity_num
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

可以看到这里面只有一个函数,这个函数返回一个整形,和前面的java头文件对应。
接下来我们另外创建一个Test文件夹,在Test文件夹下创建jni目录,然后将刚才生成的头文件拷贝进来。

2017-11-04 15-44-11屏幕截图.png

实现头文件

然后我们创建JNITest.c文件,文件内容如图:

#include "cn_scnu_MainActivity.h"

JNIEXPORT jint JNICALL Java_cn_scnu_MainActivity_num
(JNIEnv *env, jobject thiz){
    return 1024;
}

这个文件的主要内容就是调用头文件并实现头文件中的方法,我们返回了1024。

编写Android.mk文件:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := JNITest
LOCAL_SRC_FILES := JNITest.c
include $(BUILD_SHARED_LIBRARY)

LOCAL_MODULE 就是我们要生成的so,LOCAL_SRC_FILES就是编译的文件

编写Application.mk文件:

APP_ABI := armeabi,armeabi-v7a

这里就表示我们要生成的so库的CPU架构。

2017-11-04 15-50-20屏幕截图.png

ndk-build

使用命令行进入到Test目录下,即jni的根目录处,然后打命令:

ndk-build
2017-11-04 15-51-55屏幕截图.png

结果如图,然后我们就可以在libs目录下发现生成的so库了。

你可能感兴趣的:(ndk编译生成so)