利用android studio 生成 JNI需要的動態庫so文件


JNI:  Java Native Interface,  提供了java語言和其他語言(例如c和c++)進行相互調用的方式。

本文是用java調用c生成的so模式。其中,編譯so文件過程如下:

1)打開android studio, 新建一個空的

點擊next, name中輸入"test",點擊finish。

創建完后,切換到project模式,顯示如下:

2、編寫帶有native聲明的java類

在test->app->src->main->java->com.sf.test目錄,右鍵新建java類,名稱為"Test"

雙擊Test,添加如下內容:

package com.sf.test;

public class Test {

public native void displayHelloWorld();

static {
System.loadLibrary("Test");
}
}

native方法 displayHelloWorld() 為我們在java中調用的函數,需要在c語言中重寫來實現。

System.loadLibrary 后面跟的是動態庫的名字。

3、利用javac編譯成java類

右鍵com.sf.test.選擇”open in terminal“,可以看見android studio底部出現終端調試助手,並且已經切換到相關目錄下。

執行命令, javac  Test.java

生成相應的class類(Test.class)

4、利用javac生成相應的h頭文件

 在main目錄下新建jni文件夾,保存相關c和h文件,以及編譯使用的文件。

命令為:

 javac Test.java -h  ../../../../jni     (將生成的h文件保存到jni目錄下)

此時可以查看到main/jni/目錄下多了一個文件: com_sf_test_Test.h,頭文件中內容為自動生成:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_sf_test_Test */

#ifndef _Included_com_sf_test_Test
#define _Included_com_sf_test_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_sf_test_Test
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_sf_test_Test_displayHelloWorld
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

其中JNIEXPORT void JNICALL Java_com_sf_test_Test_displayHelloWorld
(JNIEnv *, jobject);
為從java轉換到c后的調用函數,對應Test.java中的 displayHelloWorld。

5、編寫c語言的本地實現
在jni目錄下添加test.c文件,其中內容為:
#include "jni.h"
#include "com_sf_test_Test.h"

JNIEXPORT void JNICALL Java_com_sf_test_Test_displayHelloWorld
(JNIEnv *jv, jobject jo)
{
printf("Hello world\n");
return ;
}

兩個頭文件必須包含,下面函數的名稱參數跟com_sf_test_Test.h中的必須一致。
6、編寫ndk相關內容
jni目錄下添加Android.mk和Application.mk文件
其中 Android.mk內容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := MyTest
LOCAL_SRC_FILES := test.c
include $(BUILD_SHARED_LIBRARY)
Application.mk內如如下:
APP_ABI := all
7、利用ndk進行編譯
在jni目錄下,輸入命令 ndk-build,可以生成相關的so文件
[armeabi] Install        : libMyTest.so => libs/armeabi/libMyTest.so
生成的文件保存子main/libs目錄下

目前存在的問題,只生成了armeabi架構適用的so文件。其他平台如x86等適用的沒有生成。

備注:
生成so文件可以通過兩種編譯方式:
1)cmake
2)ndk-build



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM