我正在尝试使用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());
    }

10-06 16:05