在Application onCreate期间反应本机Android模块调用库

时间:2019-03-07 11:04:19

标签: android react-native

我已经编写了一个React Native模块来访问蓝牙设备。该设备拥有自己的Android和iOS SDK。在Android中,需要在Android Application onCreate方法期间调用特定的SDK函数。

从父应用程序调用此功能的正确方法是什么?是在库模块中创建一个可以由父应用程序调用的方法,还是导入库模块使用的JAR依赖项,而直接从父库中调用SDK的onCreate函数?

首先,我尝试从库模块构造函数中调用它,但是SDK需要一个应用程序对象,而不是一个应用程序上下文。

以下是模块的相关部分:

public MyLibraryModule(ReactApplicationContext reactContext) {
    super(reactContext);
    this.reactContext = reactContext;
    SomeBluetoothManager.onApplicationCreate(reactContext);
}

由于我需要在onApplicationCreate期间调用依赖SDK的onCreate方法,因此我尝试直接在父应用程序中导入库:

import com.something.SomeBluetoothManager;

然后在React Native android应用的MainApplication.java中:

@Override
public void onCreate() {
    super.onCreate();
    SomeBluetoothManager.onApplicationCreate(this);
}

这找不到蓝牙管理器类的导入。父React Native应用程序是否应该自动包含本机库模块中的所有库并使它们可用,以便我可以将其导入到应用程序中?

我在名为libs的文件夹中具有Bluetooth SDK jar文件和相关的.so文件,并将其添加到模块build.gradle文件的相关部分:

android {
    ...
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}

由于导入未找到要导入的子库,我最后的想法是在库模块类或库包类中创建静态方法:

public static void onCreate(Application app) {
    SomeBluetoothManager.onApplicationCreate(app);
}

如果我将此静态调用添加到应用程序onCreate覆盖方法中,该应用程序将在启动时崩溃:

@Override
public void onCreate() {
    super.onCreate();
    MyLibraryPackage.onCreate(this);
}

1 个答案:

答案 0 :(得分:0)

您可以从ReactApplicationContext获得应用程序上下文,然后将应用程序上下文转换为一种应用程序类型:

Application app = (Application)reactContext.getApplicationContext();
SomeBluetoothManager.onApplicationCreate(app);

这似乎使我摆脱了使用该特定蓝牙库的障碍。