在jni中为Android应用程序提供现有的库(.so)

时间:2014-07-08 08:52:34

标签: android android-ndk java-native-interface

我想知道这个idea。我花了几天时间搜索信息,但找不到任何东西。所有教程都说如何使用JNI编写自己的库,但是如何包装已经存在的?我需要一步一步的简单教程(为什么?如果可能的话)。所以我想开始创建本机android应用程序。


我拥有的: 我在QTCreator中通过youtube的教程创建C ++库: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 / main文件夹“jni”中创建。创建 Android.mk myLibWrapper.h myLibWrapper.cpp 。但我不明白我需要在Android.mk中编写什么来连接我的 myLib.so 到“myLibWrapper.h”,以及我应该把我的库放在哪里头。有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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);

在C / C ++文件中使用您必须在jni端执行的任何操作来实现此功能。

然后,定义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工作室重建Android项目并运行。

有关详细说明和完整来源,请gist