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目录,然后将刚才生成的头文件拷贝进来。
实现头文件
然后我们创建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屏幕截图.pngndk-build
使用命令行进入到Test目录下,即jni的根目录处,然后打命令:
ndk-build
2017-11-04 15-51-55屏幕截图.png
结果如图,然后我们就可以在libs目录下发现生成的so库了。
网友评论