ndk-build編譯生成so庫(kù)
本文講述使用Android 的ndk-build來(lái)編譯生成so庫(kù),在命令行中編譯。編譯后的so庫(kù)可以調(diào)用。
環(huán)境問(wèn)題略過(guò),請(qǐng)自行百度或谷歌安裝ndk。
建立java文件
新建文件夾/cn/scnu
并在文件夾中創(chuàng)建java 文件:
package cn.scnu;
public class MainActivity{
public native int num();
}
編譯java文件
javac cn/scnu/MainActivity.java -d build
該命令會(huì)編譯java文件并在build目錄下生成,然后我們打開(kāi)build目錄
cd build/
javah生成頭文件
然后我們使用javah命令:
javah cn.scnu.MainActivity // 注意這里是英文句號(hào)而不是/,簡(jiǎn)單的說(shuō)就是javah+包名+類名
然后會(huì)生成一個(gè).h頭文件,我們打開(kāi)這個(gè)頭文件看看:
/* 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
可以看到這里面只有一個(gè)函數(shù),這個(gè)函數(shù)返回一個(gè)整形,和前面的java頭文件對(duì)應(yīng)。
接下來(lái)我們另外創(chuàng)建一個(gè)Test文件夾,在Test文件夾下創(chuàng)建jni目錄,然后將剛才生成的頭文件拷貝進(jìn)來(lái)。
2017-11-04 15-44-11屏幕截圖.png
實(shí)現(xiàn)頭文件
然后我們創(chuàng)建JNITest.c文件,文件內(nèi)容如圖:
#include "cn_scnu_MainActivity.h"
JNIEXPORT jint JNICALL Java_cn_scnu_MainActivity_num
(JNIEnv *env, jobject thiz){
return 1024;
}
這個(gè)文件的主要內(nèi)容就是調(diào)用頭文件并實(shí)現(xiàn)頭文件中的方法,我們返回了1024。
編寫(xiě)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就是編譯的文件
編寫(xiě)Application.mk文件:
APP_ABI := armeabi,armeabi-v7a
這里就表示我們要生成的so庫(kù)的CPU架構(gòu)。
2017-11-04 15-50-20屏幕截圖.png
ndk-build
使用命令行進(jìn)入到Test目錄下,即jni的根目錄處,然后打命令:
ndk-build
2017-11-04 15-51-55屏幕截圖.png
結(jié)果如圖,然后我們就可以在libs目錄下發(fā)現(xiàn)生成的so庫(kù)了。