java方法getChLength_利用JNI调用C/C++方法实现从控制台输入密码

最近看到一个问题,如何用Java实现从控制台输入密码?

本来以为是很简单的问题,查了一下发现Java居然没提供这样一个方法。目前实现的方式有2个,一个是利用JNI来调用C/C++方法,另一个是使用多线程。

下面是使用JNI的方法:

首先,写出我们的Java类:

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

public

class

JNIPasswordReader

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

private

native

String readPassword();

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

static

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png        System.loadLibrary(

"

PasswordDLL

"

);

ecedf933ec37d714bd4c2545da43add2.png    }

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

/** */

/**

d18c02628675d0a2c816449d98bda930.png     *

@param

args

ecedf933ec37d714bd4c2545da43add2.png

*/

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

public

static

void

main(String[] args)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

//

TODO Auto-generated method stub

d18c02628675d0a2c816449d98bda930.png

JNIPasswordReader reader

=

new

JNIPasswordReader();

d18c02628675d0a2c816449d98bda930.png        String pwd

=

reader.readPassword();

d18c02628675d0a2c816449d98bda930.png        System.out.println(

"

\nYour Password is:

"

+

pwd);

ecedf933ec37d714bd4c2545da43add2.png    }

d18c02628675d0a2c816449d98bda930.png

8f1ba5b45633e9678d1db480c16cae3f.png}

这一段使用System.loadLiberary("..");来加载本地类库,PasswordDLL是文件名,不需要加dll后缀,系统会自动辨认。

编译成JNIPasswordReader.class以后,使用

javah -jni JNIPasswordReader

命令,生成一个JNIPasswordReader.h文件,文件内容如下:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

/**/

/*

DO NOT EDIT THIS FILE - it is machine generated

*/

4f1150b881333f12a311ae9ef34da474.png#include

<

jni.h

>

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

/**/

/*

Header for class JNIPasswordReader

*/

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png#ifndef _Included_JNIPasswordReader

4f1150b881333f12a311ae9ef34da474.png

#define

_Included_JNIPasswordReader

4f1150b881333f12a311ae9ef34da474.png#ifdef __cplusplus

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

extern

"

C

"

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

#endif

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

/**/

/*

d18c02628675d0a2c816449d98bda930.png * Class:     JNIPasswordReader

d18c02628675d0a2c816449d98bda930.png * Method:    readPassword

d18c02628675d0a2c816449d98bda930.png * Signature: ()Ljava/lang/String;

ecedf933ec37d714bd4c2545da43add2.png

*/

d18c02628675d0a2c816449d98bda930.pngJNIEXPORT jstring JNICALL Java_JNIPasswordReader_readPassword

d18c02628675d0a2c816449d98bda930.png  (JNIEnv

*

, jobject);

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png#ifdef __cplusplus

8f1ba5b45633e9678d1db480c16cae3f.png}

4f1150b881333f12a311ae9ef34da474.png

#endif

4f1150b881333f12a311ae9ef34da474.png

#endif

4f1150b881333f12a311ae9ef34da474.png

然后,我们需要写一个cpp文件来实现

JNIEXPORT jstring JNICALL Java_JNIPasswordReader_readPassword  (JNIEnv *, jobject);

接口。

于是,我写了一个PasswordDLL.cpp文件,内容如下:

4f1150b881333f12a311ae9ef34da474.png

//

这是主 DLL 文件。

4f1150b881333f12a311ae9ef34da474.png

#include

"

stdafx.h

"

4f1150b881333f12a311ae9ef34da474.png#include

"

JNIPasswordReader.h

"

4f1150b881333f12a311ae9ef34da474.png#include

<

iostream

>

4f1150b881333f12a311ae9ef34da474.png#include

<

iomanip

>

4f1150b881333f12a311ae9ef34da474.png#include

<

conio.h

>

4f1150b881333f12a311ae9ef34da474.png

using

namespace

std;

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

/**/

/*

d18c02628675d0a2c816449d98bda930.png * Class:     JNIPasswordReader

d18c02628675d0a2c816449d98bda930.png * Method:    readPassword

d18c02628675d0a2c816449d98bda930.png * Signature: ()V

8f1ba5b45633e9678d1db480c16cae3f.png

*/

4f1150b881333f12a311ae9ef34da474.pngJNIEXPORT jstring JNICALL Java_JNIPasswordReader_readPassword

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif  (JNIEnv

*

env, jobject)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

char

str[

20

]

=

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

0

}

;

d18c02628675d0a2c816449d98bda930.png    jstring jstr;

d18c02628675d0a2c816449d98bda930.png

char

ch;

d18c02628675d0a2c816449d98bda930.png

char

*

pstr

=

str;

d18c02628675d0a2c816449d98bda930.png

while

(

true

)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png        ch

=

getch();

d18c02628675d0a2c816449d98bda930.png

if

(isdigit(ch)

||

isalpha(ch))

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png            cout

<<

"

*

"

;

d18c02628675d0a2c816449d98bda930.png

*

pstr

++

=

ch;

ecedf933ec37d714bd4c2545da43add2.png        }

d18c02628675d0a2c816449d98bda930.png

else

if

(ch

==

'

\b

'

&&

pstr

>

str)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

*

(

--

pstr)

=

0

;

d18c02628675d0a2c816449d98bda930.png            cout

<<

"

\b \b

"

;

ecedf933ec37d714bd4c2545da43add2.png        }

d18c02628675d0a2c816449d98bda930.png

else

if

(ch

==

0x0A

||

ch

==

0x0D

)

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

break

;

ecedf933ec37d714bd4c2545da43add2.png        }

ecedf933ec37d714bd4c2545da43add2.png    }

d18c02628675d0a2c816449d98bda930.png    jstr

=

env

->

NewStringUTF(str);

d18c02628675d0a2c816449d98bda930.png

return

jstr;

8f1ba5b45633e9678d1db480c16cae3f.png}

我使用VS2005来生成对应的dll文件,在生成之前,需要把$JDK_HOME/include/jni.h和$JDK_HOME/include/win32/jni_md.h这两个文件copy到Microsoft Visio Studio 8/VC/include目录下,我就在这里卡了大概1个小时,一直说找不到jni.h文件

然后就可以使用VS2005来生成dll了,生成好对应的PasswordDLL.dll以后,把该dll文件放到系统变量PATH能找到的地方,比如windows/system32/或者jdk/bin目录,我是放到JDK_HOME/bin下面了

放好以后,

执行java JNIPasswordReader

就可以输入密码了。

关于JNI的更详细内容,可以参考:

《在Windows中实现Java本地方法》http://www.ibm.com/developerworks/cn/java/jnimthds/index.html

我的Password.dll文件

http://www.blogjava.net/Files/richardeee/PasswordDLL.zip

在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值