std::getenv

头文件:

<cstdlib>

char *getenv(const char* env_var);

作用:

搜索与env_var字符串相匹配的主机环境(操作系统)提供的环境列表,返回该列表成员。

(C++ 11之前) 该函数没有被要求线程安全。其他的对getenv的调用,还有POSIX函数setenv(),unset()以及putenv的调用,都有可能由于之前的调用或者由于前面调用而修改了字符串导致返回值无效。 

(C++ 11之后)该函数是一直线程安全(多线程调用不会引入数据竞争)的除非其他函数修改了主机环境。特别的是,POSIX函数setenv(),unsetenv()以及putenv()如果调用时没有进行同步会引入数据竞争。

修改getenv所返回的字符串会引发未知的后果。

参数:

env_var - null结尾的字符串,标明需要查询的环境变量名。

返回值:

返回字符串标明的环境变量值或者返回空指针若该变量没有找到

注意:

在POSIX系统上,环境变量也可通过全局变量environ访问到,由extern char **environ所描述。它位于在<unistd.h>文件中以及在man函数中通过第三方可选参数envp可知。

以下实例是在 Win10 OS上面的:

#include "stdafx.h"
#include "stdio.h"
#include <iostream>
#include <cstdlib>

#pragma warning(disable : 4996)// for _CRT_SECURE_NO_WARNINGS
#if 1
int main()
{
	if (const char* env_p = std::getenv("PATH"))
	{
		std::cout << "My PATH is: " << env_p << '\n' << std::endl;

	}
	getchar();
	return 0;
}


由于会报错:

错误 1 error C4996: 'getenv': This function or variable may be unsafe. Consider using _dupenv_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. C:\Users\xxx\Documents\Visual Studio 2013\Projects\test\test\test.cpp 14 1 test

所以在代码添加一段忽略警告:

#pragma warning(disable : 4996)// for _CRT_SECURE_NO_WARNINGS

输出:



列出用户环境变量,系统环境变量,以及编译器环境变量。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现一个test(std::string path_int, std::string path_out) JNI接口和test_callback(std::string path_out) JNI接口,需要按照以下步骤进行操作: 1.创建一个C++头文件,并在其中声明test(std::string path_int, std::string path_out)和test_callback(std::string path_out) JNI接口函数。 2.在C++源文件中实现这些JNI接口函数,并包含jni.h头文件以便使用JNI API。 3.编写Java类,并使用Java Native Interface (JNI)来访问C++代码。 4.在Java类中声明native方法,并使用JNI方法注册这些native方法。 5.在Java代码中实现这些native方法,以便在C++代码中调用。 以下是一个简单的示例: C++头文件: ``` #ifndef _MY_JNI_INTERFACE_H_ #define _MY_JNI_INTERFACE_H_ #include <jni.h> #include <string> #ifdef __cplusplus extern "C" { #endif JNIEXPORT void JNICALL Java_com_example_MyClass_test(JNIEnv* env, jobject obj, jstring path_int, jstring path_out); JNIEXPORT void JNICALL Java_com_example_MyClass_test_1callback(JNIEnv* env, jobject obj, jstring path_out); #ifdef __cplusplus } #endif #endif // _MY_JNI_INTERFACE_H_ ``` C++源文件: ``` #include "my_jni_interface.h" JNIEXPORT void JNICALL Java_com_example_MyClass_test(JNIEnv* env, jobject obj, jstring path_int, jstring path_out) { const char* c_path_int = env->GetStringUTFChars(path_int, NULL); const char* c_path_out = env->GetStringUTFChars(path_out, NULL); // 实现test函数的代码 env->ReleaseStringUTFChars(path_int, c_path_int); env->ReleaseStringUTFChars(path_out, c_path_out); } JNIEXPORT void JNICALL Java_com_example_MyClass_test_1callback(JNIEnv* env, jobject obj, jstring path_out) { const char* c_path_out = env->GetStringUTFChars(path_out, NULL); // 实现test_callback函数的代码 env->ReleaseStringUTFChars(path_out, c_path_out); } ``` Java类: ``` package com.example; public class MyClass { static { System.loadLibrary("my_jni_interface"); } public native void test(String path_int, String path_out); public native void test_callback(String path_out); } ``` JNI方法注册: ``` #include <jni.h> #include "my_jni_interface.h" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = NULL; jint result = -1; if (vm->GetEnv((void**)&env, JNI_VERSION_1_6) != JNI_OK) { return JNI_ERR; } jclass clazz = env->FindClass("com/example/MyClass"); if (clazz == NULL) { return JNI_ERR; } JNINativeMethod methods[] = { {"test", "(Ljava/lang/String;Ljava/lang/String;)V", (void*)Java_com_example_MyClass_test}, {"test_callback", "(Ljava/lang/String;)V", (void*)Java_com_example_MyClass_test_1callback} }; if (env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0])) < 0) { return JNI_ERR; } return JNI_VERSION_1_6; } ``` Java代码: ``` package com.example; public class Main { public static void main(String[] args) { MyClass myClass = new MyClass(); String path_int = "/path/to/input/file"; String path_out = "/path/to/output/file"; myClass.test(path_int, path_out); myClass.test_callback(path_out); } } ``` 这样,当Java代码调用test和test_callback方法时,将会执行C++实现的test和test_callback JNI接口函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值