我想知道这个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”,以及我应该把我的库放在哪里头。有人可以帮忙吗?
答案 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