Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript react native(android)中.jar文件的访问方法_Javascript_Java_Android_Reactjs_React Native - Fatal编程技术网

Javascript react native(android)中.jar文件的访问方法

Javascript react native(android)中.jar文件的访问方法,javascript,java,android,reactjs,react-native,Javascript,Java,Android,Reactjs,React Native,我想将一个本机java编写的模块Android导入我的React本机源代码JS。要访问用java实现的功能,必须创建一个桥接器。您可以在RN文档站点*中查看最新的说明 假设React Native 0.61为hello world,这些步骤将在React Native app目录android目录内的android项目中实施: 1首先创建一个简单的POJO类以返回到react本机上下文: class MyData{ private int timeSpentSleeping;

我想将一个本机java编写的模块Android导入我的React本机源代码JS。

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

假设React Native 0.61为hello world,这些步骤将在React Native app目录android目录内的android项目中实施: 1首先创建一个简单的POJO类以返回到react本机上下文:

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本机模块执行某些操作并将此类对象作为javascript返回:

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();
    }
}
现在,我们创建不同于java包的React本机包:

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();
    }
}
诸如此类:

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;
        }
可以从变量HelloPromise访问本机类。 在代码的react本机端,您可以通过以下方式获得HelloPromise.foobar的结果:

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

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

这应该可以帮助您解决这个问题。您更喜欢facebook文档而不是教程。最新的2019年12月发布的RN 0.6版本已经过时了*如果您的android项目存在DEX问题,请将minSdkVersion至少提升到24 int build.gradle*您的应用程序将在iOS中崩溃,直到您将jar移植到swift/objectivec并构建本地iOS桥。
import {
  NativeModules,
} from 'react-native';
...
const {HelloPromise} = NativeModules;
async function handleHelloPromisesPress() {
   let result = await HelloPromise.foobar();
   console.log(result);
}