我正在尝试使用Libcore设置环境变量,所以我使用了以下答案:
How do I set environment variables from Java?
在Android上,该接口通过Libcore.os作为一种隐藏的API公开。
Libcore.os.setenv(“ VAR”,“ value”,bOverwrite);
Libcore.os.getenv(“ VAR”));
Libcore类以及接口OS是公共的。仅缺少类声明,需要将其显示给链接器。无需将类添加到应用程序中,但是如果包含了类,也不会受到损害。
package libcore.io;
public final class Libcore {
private Libcore() { }
public static Os os;
}
package libcore.io;
public interface Os {
public String getenv(String name);
public void setenv(String name, String value, boolean overwrite) throws Exception;
}
但是,当我这样做时,它似乎不起作用,因为在C代码中执行getenv时,我没有返回值。
当我这样做时
char* p;
setenv("VAR", "test variable", 1);
p = getenv("VAR");
LOG(ERROR) << "Test" << p;
它可以正常工作。
我所做的是分别为Libcore.java和Os.java创建了两个虚拟文件,并使用我的主要代码对其进行了编译:
这是我的Java代码:
try{
Libcore.os.setenv("VAR", "value", true);
}catch(Exception e){
Log.d("Test set",e.toString());
}
我的C代码如下:
char* p;
p = getenv("VAR");
LOG(ERROR) << "Test" << p;
我可以使用JNI,但我试图弄清楚libcore为何不起作用。使用系统Libcore时,是否需要将某些特殊命令与编译器命令一起使用?
最佳答案
您可以使用反射来动态调用该类。
try {
Class < ? > libcore = Class.forName("libcore.io.Libcore");
if (libcore == null) {
Log.w(TAG, "Cannot find libcore.os.Libcore;");
// return;
} else {
final Object os = Class.forName("libcore.io.Libcore").getField("os").get(null);
Method method = os.getClass().getMethod("setenv", String.class, String.class, boolean.class);
method.invoke(os, "value", "test", true);
}
} catch (Exception e) {
Log.w("Sam1", Log.getStackTraceString(e));
Log.w("Sam1", e.getMessage());
}