我正在尝试使用Libcore来设置环境变量,所以我使用了以下答案:
How do I set environment variables from Java?
在Android上,该接口通过Libcore.os作为一种隐藏的API公开。
Libcore.os.setenv(“VAR”,“value”,bOverwrite); Libcore.os.getenv( “VAR”));
Libcore类以及接口操作系统是公共的。只缺少类声明,需要向链接器显示。无需将类添加到应用程序中,但如果包含它也不会受到影响。
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?
答案 0 :(得分:3)
您可以使用反射动态调用该类。
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());
}