利用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
轉載于:https://www.cnblogs.com/rohens-hbg/p/10676681.html
總結
以上是生活随笔為你收集整理的利用android studio 生成 JNI需要的动态库so文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 莫吉托女孩什么梗
- 下一篇: 刺客信条大革命苏杰之鹰怎么获得