Os.setEnv / System.setProperty 不适用于模拟器

问题描述 投票:0回答:1

我的应用程序携带本机 NDK 库 (*.so),它需要在执行其方法之前设置工作环境变量 - 应用程序层在

Application
启动时执行此操作,然后再通过 JNI 进一步运行本机部分。

我已经实现了

Os.setEnv
,并且几乎可以在每个正在运行的物理设备应用程序上完成这项工作,可能有数十个从 API27 开始的 diff 单元在过去的十多个月里尝试过。另外,我听说该应用程序在 ARM Mac 上的模拟器上运行良好,但我刚刚在 Windows 上配置了 ARM 处理模拟器(因为我的 *.so 库仅是 arm64),应用程序运行,
setEnv
s ,然后运行本机代码,这...报告缺少环境...为什么?

我也尝试过

System.setProperty
,但没有运气

android environment-variables android-emulator
1个回答
0
投票

解决方法 - pico-native-lib 用于在本机端进行设置:

#include <jni.h>
#include <cstdlib>
#include <cstring>

extern "C"
JNIEXPORT jint JNICALL
Java_my_package_name_Sandbox_setenv(JNIEnv *env, jclass, jstring key, jstring value) {
    const char *nativeKey = env->GetStringUTFChars(key, 0);
    const char *nativeValue = env->GetStringUTFChars(value, 0);

    if (nativeKey != nullptr && nativeValue != nullptr) {
        setenv(nativeKey, nativeValue, 1);
    }

    env->ReleaseStringUTFChars(key, nativeKey);
    env->ReleaseStringUTFChars(value, nativeValue);
    return 0;
}

框架端(Java):

package my.package.name;

public class Sandbox {

    static {
        System.loadLibrary("Sandbox");
    }

    public static native int setenv(String key, String value);
}

现在同时拨打

Os.setEnv
Sandbox.setenv

没有标记为答案,因为很好奇我为什么这样做......

© www.soinside.com 2019 - 2024. All rights reserved.