A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 熊永标 中级黑马   /  2013-1-11 14:19  /  7525 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请问一下,有没有办法编一个软件,能够动态的设值环境变量呀?

2 个回复

倒序浏览
这题有兴趣,我来答,java程序本身无法修改操作系统的环境变量,只能用System.getProperty() 取得jvm当前系统变量,若修改系统变量,只能用到系统相关函数
最好利用JNI(论坛我几次回复过,得到了都是金币,没技术分,感觉自己快out了 )调用本地c语言的函数库....我在这写个代码试试
  1. /**
  2. @author jonn
  3. @version 1.0
  4. @date 2013/1/11
  5. */
  6. public class ChangEnv {
  7. static {
  8.   try {
  9.   System.loadLibrarliy("change_env"); //加载动态链接库
  10.   }catch(Exception e){
  11.   System.err.println("can not load library"+e.toString());
  12. }
  13. }
  14. public native void setEnv(String name,String value,int replace); //声明本地调用接口
  15. }
复制代码
在这注意,若windows环境加载动态库是*.dll 文件,反之是linux环境则是*.so文件,在这里我是linux系统环境

在本地系统使用JDK命令,javah  ChangeEnv 生成了ChangeEnv.h 看我编译生成了



查看这个头文件 如图


这时候开始写c语言文件了 change_env.c ,这里我用gcc编译器

  1. #include"ChangeEnv.h"
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. JNIEXPORT void JNICALL Java_ChangeEnv_setEnv(JNIEnv * env, jobject obj, jstring name, jstring value, jint replace)
  5. {
  6.     /*从instring字符串取得指向字符串UTF编码的指针*/
  7.     const char * name_char =(const char *) env->GetStringUTFChars(name ,JNI_FALSE);
  8.     const char * value_char =(const char *) env->GetStringUTFChars(value ,JNI_FALSE);
  9.     /*调用的C库函数*/
  10.     setenv(name_char,value_char,replace);
  11. /* 通知jvm不再访问name_char,value_char,否则内存泄露
  12.     env->ReleaseStringUTFChars(name,(const char *)name_char);
  13.     env->ReleaseStringUTFChars(value,(const char *)value_char);
  14.     return ;     
  15. }



复制代码
编译ChangeEnv.c文件,生成libchange_env.so文件
我这里出错,真伤脑筋,望论坛里高手帮我搞定下{:soso_e135:},我这里是linux环境


查看 jni.h 头文件存在这两个函数啊,GetStringUTFchars() ReleaseUTFChars(); 如下图,真让我郁闷.....

写测试文件
  1. import java.io.*;

  2. public class ChangeEnvTest {

  3. public static void main(String[] args) {
  4.      System.out.println(System.getenv("PATH"));//当前PATH路径
  5.       String pathPer = System.getProperty("java.library.path");
  6.       pathPer+=":.";
  7.       System.setProperty("java.library.path",pathPer);//把当前路径加载动态链接库路径中
  8.       ChangeEnv changePath = new ChangeEnv ();//生成一个ChangeEnv对象
  9.       changePath.setEnv("PATH","$PATH:/usr/java/jdk*/bin:/usr/java/jdk*/sbin",1);
  10.       System.out.println(System.getenv("PATH"));//打印改变之后的PATH路径
  11.   }
  12. }
复制代码
上步ChangeEnv.c文件无法完成编译,这里无法加载动态文件.....哎....坐等高人指导....











QQ截图20130111161155.png (37.7 KB, 下载次数: 46)

QQ截图20130111161155.png

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
求高人进,探讨这个问题........论坛里有牛B 的技术老师逛贴么?指导下这道题...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马