我的应用程序携带本机 NDK 库 (*.so),它需要在执行其方法之前设置工作环境变量 - 应用程序层在
Application
启动时执行此操作,然后再通过 JNI 进一步运行本机部分。
Os.setEnv
,并且几乎可以在每个正在运行的物理设备应用程序上完成这项工作,可能有数十个从 API27 开始的 diff 单元在过去的十多个月里尝试过。另外,我听说该应用程序在 ARM Mac 上的模拟器上运行良好,但我刚刚在 Windows 上配置了 ARM 处理模拟器(因为我的 *.so 库仅是 arm64),应用程序运行,setEnv
s ,然后运行本机代码,这...报告缺少环境...为什么?
我也尝试过
System.setProperty
,但没有运气
解决方法 - 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
没有标记为答案,因为很好奇我为什么这样做......