ndk編譯生成so

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ù)了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容