假設我們有一個預先構建的本地庫,名爲libname.a。 我們需要從Java活動中調用本地庫中包含的本地函數。一個例子是這樣的一個存儲在主頭文件:NDK - 包含預建庫並在Android項目中調用本地函數
DLLEXPORT int DLLCALL function(Xhandle handle, unsigned char *srcBuf, unsigned char *dstBuf);
凡Xhandle
是在頭文件還定義了一個結構體。
armv6
|- header1.h
|- header2.h
|- ...
|- libname.a
armv7
|- header1.h
|- header2.h
|- ...
|- libname.a
x86
|- header1.h
|- header2.h
|- ...
|- libname.a
我們需要這個庫導入到我們的Android項目:
的文件如下,我們正在構建。 我們做了什麼:
- 安裝了NDK和CMake工具。
- Checked在創建項目時包含C++支持。
- 在項目中創建一個jni目錄,並複製上述文件。
我們CMakeList.txt
文件(存儲在項目的根文件夾):
cmake_minimum_required(VERSION 3.4.1)
add_library(name
STATIC# We guessed it's a static due to the .a extension
IMPORTED # No source code (.c or .cpp) available)
然後,我們創建了一個Android.mk
文件中的JNI目錄:
LOCAL_PATH := $(call my-dir)
TARGET_ARCH_ABI := armv7
include $(CLEAR_VARS)
LOCAL_MODULE := name
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libname.a
LOCAL_EXPORT_C_INCLUDES := $(TARGET_ARCH_ABI)
include $(PREBUILT_STATIC_LIBRARY)
所有這一切都從閱讀推導以下鏈接:
- Android.mk
- Prebuilts 在我們的Java活動
- Add Native Code
現在,我們知道我們需要添加這樣的事情:
public native int function();
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("name");
}
我們覺得我們做錯了什麼,而我們是遺漏了什麼。我們還必須定義這些論點,並且我們認爲我們應該寫一個包裝。
所以,任何幫助,將不勝感激。
在包含原生函數定義的Java文件上運行'javah'。將會輸出正確的方法名稱的C頭文件。在C或C++文件中實現此方法,並在其中調用您的預構建函數。不要忘記將它們連接在一起。 –
@RichardCritten「...包含原生函數定義的Java文件。」你的意思是Java的活動? –
其中包含以下(或類似)行的Java文件:'public native int function();'此行告訴Java您有一個名爲'function'的本地方法,它不接受任何參數並返回一個int。 'javah'將從包,類和方法簽名中生成正確的C函數定義。 –