Java JNI实践,javajni实践
Java JNI实践,javajni实践
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互(如C/C++),很好 的解决了JAVA不能跨语言的缺陷。自己简单的拼凑了一个小例子。无图无真相,先上图(图是参照别人的画的):
实现步骤:
准备: C/C++开发工具用的VC++,Java用的eclipse1、用eclipse定义如下NativeTest.java
public class NativeTest {
static {
//加载本地库
System.loadLibrary("NativeTest");
}
/*
*定义本地方法
*@param msg 申明要带的参数
**/
private static native void sayHello(String msg);
public static void main(String[] args) {
//调用本地方法
NativeTest.sayHello("The First Native Program");
System.out.println("\n---OVER----");
}
}
2、进入src目录编译NativeTest.java生成NativeTest.class文件,再使用命令javah NativeTest生成供C\C++使用的头文件 NativeTest.h,如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class NativeTest */
#ifndef _Included_NativeTest
#define _Included_NativeTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: NativeTest
* Method: sayHello
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_NativeTest_sayHello
(JNIEnv *, jclass, jstring);
#ifdef __cplusplus
}
#endif
#endif
3、打开VC++建立一个Win32 Dynamic-Link Library工程
在弹出以下窗口后选择简单的DLL工程,再点击完成
将 NativeTest.h拷贝放置C工程目录下。
选中 NativeTest.h导入工程
编辑StdAfx.h,在最后面加上
#include " NativeTest.h"
打开NativeTest.cpp
将NativeTest.h中的
JNIEXPORT void JNICALL Java_NativeTest_sayHello
(JNIEnv *, jclass, jstring)
拷贝贴进去并实现,如下:
JNIEXPORT void JNICALL Java_NativeTest_sayHello
(JNIEnv * env, jclass obj, jstring jMsg)
{
const char *strMsgPtr = env->GetStringUTFChars( jMsg , 0);
printf(strMsgPtr);
env->ReleaseStringUTFChars( jMsg, strMsgPtr);
}
OK。F7 biuld一把会出现以下错误:
解决思路有三种:
a、\jdk\include\jni.h \jdk\include\win32\jawt_md.h \jdk\include\win32\jni_md.h
复制到VC++的安装目录下的\VC98\include目录中
b、将\jdk\include\jni.h \jdk\include\win32\jawt_md.h \jdk\include\win32\jni_md.h拷贝到C的工程目录,并将NativeTest.h 中的 #include <jni.h>改成#include "jni.h"
c、点击VC++菜单栏的工具按钮---> 选择 选项 ----> 点击弹出窗体选项卡上的目录 ----> 点击新建图标
添加上jdk所在文件夹下的include和include\win32文件夹。
再编译, OK。成功。
4、将C工程debug目录生成的NativeTest.dll拷贝到java的运行目录。(ps: 跟class丢在一起)
5、java NativeTest 打印以下内容, 调用成功了。
相关文章
- 暂无相关文章
用户点评