在Java中使用VC++组件(2)

分类: J2SE   出处:iocblog整理  更新时间:2008-09-08   添加到收藏  

执行下面的步骤:

 1.编译代码生成.class文件

2.在jdk文件夹中找到javah命令

3.在dos命令行下执行javah -jni jnitest

执行完上面的步骤将产生jnitest .h文件。这个.h文件包含了在java代码中声明的本地方法的vc++中的函数名。

创建jni dll

我已经完成了一半了。
 

    现在,在Visual Studio(和其他任何win32 IDE)创建一个简单的dll工程然后添加上面的.h文件到工程中。[来源www.iocblog.net]

    为了获得包含的文件jni.h,添加JRE\INCLUDE文件夹的路径到你的includes中。

    现在你会发现在.Java文件中声明的方法的命名,稍微有些不同。

在上面的例子中你会得到:

JNIEXPORT void JNICALL Java_JNITest_showMessage(JNIEnv *, jobject, jstring);

这里,第三个参数是你的从Java中输入的参数。你能转换它成本地的形式如下:

const char *strS1 = env->GetStringUTFChars( s1, 0);

    这里,你能够在程序中使用steS1作为C++字符串。在demo程序中我使用了它,把它显示在MessageBox中。有许多JNIEnv的方法,通过这些方法我们可以将多种Java数据类型转换成C++数据类型。

    使用完字符串之后必须释放它,字符串不会自用释放。JNI的行为被假设为JVM的外部行为,因此它不会抛任何类型的能够被Java代码捕捉的异常。如果在离开函数前,你忘记了释放字符串,那么这可能会导致你的JVM的crash。

你可以使用函数ReleaseStringUTFChars释放字符串:
env->ReleaseStringUTFChars( s1, strS1);

整个代码可能会是这样:

JNIEXPORT void JNICALL Java_JNITest_showMessage(
    JNIEnv * env, jobject job, jstring str )
{
       const char *strMsgPtr     = env->GetStringUTFChars( str , 0);
       //Converting string to C++ character pointer

       MessageBox( 0, strMsgPtr,"Message box from VC++ ", 0 );
       //Using the string

       env->ReleaseStringUTFChars( str, strMsgPtr);
       // Releasing the string ( character pointer )
}

现在你可以自由的使用Windows(或VC++)组件做任何事情了??现在你可以使用Windows API了。

编译一个dll然后放在Java程序的文件夹中(这个文件夹包含你的.class文件)。

现在运行你的Java程序。

    注意:如果你得到了UnSatisfiedLinkError错误,那么检查你的方法原型,它必须与你在.h文件中提供的一样。

使用JNI你可以在Java程序中使用许多Windows提供的工具。

上一页 [1] [2]



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。