如何使用Libcore.os设置环境变量

时间:2016-02-04 06:04:36

标签: java android android-ndk

我正在尝试使用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?

1 个答案:

答案 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());
    }