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 <jni.h>
/* 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库了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容