2014-07-08 28 views
2

我想實現這idea。我花了幾天的時間尋找信息,但找不到任何東西。所有的教程都說如何用JNI編寫我自己的庫,但是如何包裝已經存在的?我需要一步一步的簡單教程(以及爲什麼?如果可能的話)。所以我想開始創建原生的android應用程序。Wrapp現有庫(.so)jni的Android應用程序


我有什麼: 我創建C++庫QTCreator通過教程從youtube:基於C簡單的庫++(的.so)與頭(.h)中其做簡單的cout控制檯: 不編譯代碼MYLIB的.cpp

#include "mylib.h"  

MyLib::MyLib() { } 

void MyLib::Test() { 
    qDebug() << "Hello from our DLL"; 
    // .so 
} 

部首mylib.h

#ifndef MYLIB_H 
#define MYLIB_H 

#include "mylib_global.h" 
#include <QDebug> 

class MYLIBSHARED_EXPORT MyLib 
{ 

public: 
    MyLib(); 

    void Test(); 
}; 

#endif // MYLIB_H 

mylib_global.h(我認爲這件事簡化版,)

所以經過構建myLib.so

現在我需要將它包裝在我的android應用程序中。所以我不明白我需要爲此做些什麼。 我在開發Android Studio。而我所知道的:

與本地方法創建Java包LibWrappClass - 「()simplePrint」 是這樣的:

public native void simplePrint(); 

我需要創建/ src目錄/主文件夾 「JNI」。創建Android.mk,myLibWrapper.hmyLibWrapper.cpp。但我不明白我需要在Android.mk中編寫什麼來將我的myLib.so連接到「myLibWrapper.h」和,我應該在哪裏將我的庫與標題。誰能幫忙?

回答

0

在您的Java代碼中添加本地方法後,您只需構建項目。現在您需要移動到由IDE編寫類文件的位置。由於您使用過Android Studio,它必須是某處路徑

out/production/YourModuleName 

打開在命令行的位置,你的項目文件夾,然後運行javah命令生成的頭文件的本地函數

javah -d <your jni folder path> <com.YourPackage.YourClass> 

YourClass應該是您聲明本地方法的地方。這個命令將創建一個名字類似com_YourPackage_YourClass.h與函數聲明頭文件看起來像

JNIEXPORT void JNICALL Java_com_YourPackage_YourClass_simplePrint 
    (JNIEnv *, jobject); 

實現你所擁有的任何操作對JNI側進行C/C++文件這一功能。

然後,定義Android。MK文件,在這種情況下,它會像

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := lib 
LOCAL_SRC_FILES := lib.c 

include $(BUILD_SHARED_LIBRARY) 

如果你有多個源文件添加他們LOCAL_SRC_FILES用空格隔開。

接下來,轉到您的jni文件夾並使用命令ndk-build構建項目。這會將.so文件放在android文件夾中libs/armeabi

最後從Android Studio重建Android項目並運行。

有關詳細說明和完整源代碼結賬,請撥打gist

+1

您是否閱讀該問題?並且我需要使用我現有的** myLib.so **?你寫了如何創建庫和我質疑如何使用已經存在的。 – facetostool

+0

我讀過你的問題,答案很簡單,如果現有的文件是用上面給出的代碼構建的,那麼你不能從你的java代碼中鏈接它。我想你已經用GCC而不是NDK來構建它。爲了使其在Android設備上工作,您必須使用NDK工具鏈進行構建。 – gnuanu

+1

請查看[gist](https://gist.github.com/gnuanu/252fd406f48f7da2c1c7)瞭解更多詳情和代碼。 – gnuanu

相關問題