这题有兴趣,我来答,java程序本身无法修改操作系统的环境变量,只能用System.getProperty() 取得jvm当前系统变量,若修改系统变量,只能用到系统相关函数
最好利用JNI(论坛我几次回复过,得到了都是金币,没技术分,感觉自己快out了 )调用本地c语言的函数库....我在这写个代码试试- /**
- @author jonn
- @version 1.0
- @date 2013/1/11
- */
- public class ChangEnv {
- static {
- try {
- System.loadLibrarliy("change_env"); //加载动态链接库
- }catch(Exception e){
- System.err.println("can not load library"+e.toString());
- }
- }
- public native void setEnv(String name,String value,int replace); //声明本地调用接口
- }
复制代码 在这注意,若windows环境加载动态库是*.dll 文件,反之是linux环境则是*.so文件,在这里我是linux系统环境
在本地系统使用JDK命令,javah ChangeEnv 生成了ChangeEnv.h 看我编译生成了
查看这个头文件 如图
这时候开始写c语言文件了 change_env.c ,这里我用gcc编译器
- #include"ChangeEnv.h"
- #include<stdio.h>
- #include<stdlib.h>
- JNIEXPORT void JNICALL Java_ChangeEnv_setEnv(JNIEnv * env, jobject obj, jstring name, jstring value, jint replace)
- {
- /*从instring字符串取得指向字符串UTF编码的指针*/
- const char * name_char =(const char *) env->GetStringUTFChars(name ,JNI_FALSE);
- const char * value_char =(const char *) env->GetStringUTFChars(value ,JNI_FALSE);
- /*调用的C库函数*/
- setenv(name_char,value_char,replace);
- /* 通知jvm不再访问name_char,value_char,否则内存泄露
- env->ReleaseStringUTFChars(name,(const char *)name_char);
- env->ReleaseStringUTFChars(value,(const char *)value_char);
- return ;
- }
复制代码 编译ChangeEnv.c文件,生成libchange_env.so文件
我这里出错,真伤脑筋,望论坛里高手帮我搞定下{:soso_e135:},我这里是linux环境
查看 jni.h 头文件存在这两个函数啊,GetStringUTFchars() ReleaseUTFChars(); 如下图,真让我郁闷.....
写测试文件- import java.io.*;
- public class ChangeEnvTest {
- public static void main(String[] args) {
- System.out.println(System.getenv("PATH"));//当前PATH路径
- String pathPer = System.getProperty("java.library.path");
- pathPer+=":.";
- System.setProperty("java.library.path",pathPer);//把当前路径加载动态链接库路径中
- ChangeEnv changePath = new ChangeEnv ();//生成一个ChangeEnv对象
- changePath.setEnv("PATH","$PATH:/usr/java/jdk*/bin:/usr/java/jdk*/sbin",1);
- System.out.println(System.getenv("PATH"));//打印改变之后的PATH路径
- }
- }
复制代码 上步ChangeEnv.c文件无法完成编译,这里无法加载动态文件.....哎....坐等高人指导....
|
|