javascript - 从 React Native(android) 中的 .jar 文件访问方法

标签 javascript java android reactjs react-native

我想将 native 编写的模块(java、Android)导入到我的 React Native 源代码中。

最佳答案

要访问用 java 实现的功能,您必须创建一个桥。您可以在 RN 文档站点* 中查看最新说明。

假设 React Native 0.61,对于一个 hello world,要在 React Native 应用程序目录(android 目录)内的 android 项目中实现: 1)首先创建一个简单的 POJO 类以返回到 React Native 上下文:

class MyData{
    private int timeSpentSleeping;

    public int getTimeSpentSleeping() {
        return timeSpentSleeping;
    }

    public void setTimeSpentSleeping(int timeSpentSleeping) {
        this.timeSpentSleeping = timeSpentSleeping;
    }

    @NonNull
    @Override
    public String toString() {
        Gson gson = new Gson();
        String json = gson.toJson(this);
        return json;
    }

    static MyData build(final int timeSpentSleeping){
        MyData newInstance = new MyData();
        newInstance.timeSpentSleeping = timeSpentSleeping;
        return newInstance;
    }
}

React Native 模块会做一些事情并将此类的对象作为 javascript Promises 返回:

public class HelloPromiseModule extends ReactContextBaseJavaModule {
    public HelloPromiseModule(@NonNull ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @NonNull
    @Override
    public String getName() {
        return "HelloPromise";
    }

    @ReactMethod
    public void foobar(Promise promise){
        Random r = new Random();
        final int timeToSleep = r.nextInt(1000);
        runThreadAndCallPromiseToJavascript(timeToSleep, promise);
    }
    //Cria um thread pra executar algo em paralelo
    private void runThreadAndCallPromiseToJavascript(final int timeToSleep,final Promise promise){
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(timeToSleep);
                    MyData result = MyData.build(timeToSleep);
                    promise.resolve(result.toString());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    promise.reject(e);
                }
            }
        });
        t.run();
    }
}

现在,我们创建 React Native 包(与 java 包不同):

public class HelloWorldPackage implements ReactPackage{
    @NonNull
    @Override
    public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
        return Arrays.<NativeModule>asList(
                new HelloPromiseModule(reactContext));
    }

    @NonNull
    @Override
    public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}

Android 版本的 React Native 应用程序的最后一步是注册您的 HelloWorldPackage: 在 Android 项目内的 MainApplication.java 中,在 getPackages() 内的包列表中(new PackageList(this)...):

packages.add(new HelloWorldPackage());

类似的事情:

protected List<ReactPackage> getPackages() {
          @SuppressWarnings("UnnecessaryLocalVariable")
          List<ReactPackage> packages = new PackageList(this).getPackages();
          // Packages that cannot be autolinked yet can be added manually here, for example:
          // packages.add(new MyReactNativePackage());
          packages.add(new HelloWorldPackage());
          return packages;
        }

现在,在 javascript 世界中获取您的 native 类:

import {
  NativeModules,
} from 'react-native';
...
const {HelloPromise} = NativeModules;

您的 native 类可通过变量 HelloPromise 访问。 您可以在代码的 React Native 端使用类似以下内容获取 HelloPromise.foobar() 的结果:

async function handleHelloPromisesPress() {
   let result = await HelloPromise.foobar();
   console.log(result);
}

你可能会注意到,“result”是一个 json,其结构与我们一开始创建的 POJO 类相同。

关于javascript - 从 React Native(android) 中的 .jar 文件访问方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59211871/

相关文章:

android - 当 `/sys/class/power_supply/battery` 不可读时 Android NDK 中的电池状态

java - asm如何生成子类

javascript - MutationObserver 和当前/计算的 CSS 样式

javascript - 这些条件有什么不同?

javascript - 如果新对象未定义则推送新对象并在可用时忽略

java - 为什么主线程等待

java - 如何在Spring MVC中启用基于http请求头的json动态 pretty-print ?

java - Kotlin 中不存在 GridView.LayoutParams?

android - fragment 硬件后退按钮事件调用两次

javascript - 循环遍历节点数组并向每个节点附加一个子节点只会附加到最后一个元素