标签:c style class blog java a
笔者在最近的项目中需要用JNI,调用C/C++编好的程序,由于此前对JNI不熟悉,在网上找了好多都是基于VC或者VS2008系列实现的,这样为了实现一个简单的调用,需要装几百兆的VC或者几个G的VS很麻烦,由于此前我一直用的dev
C++做C的开发(这个DEV很小巧,功能很强大,只是自动补全不友好),于是决定就采用DEV实现JNI的本地文件的编译:步骤如下:
1.0 编写java类
- public class My{
-
- public native String hello(String arg);
- static{
- System.loadLibrary("My");
- }
- public static void main(String[] args)
- {
- new My().hello("Hello");
- }
- }
2.0 编译该java文件:javac -cp My.java
3.0 产生头文件: javah -jni My
将会在目录下产生My.h的头文件
-
-
-
- #include <jni.h>
-
-
- #ifndef _Included_My
- #define _Included_My
- #ifdef __cplusplus
- extern "C" {
- #endif
-
-
-
-
-
- JNIEXPORT jstring JNICALL Java_My_hello
- (JNIEnv *, jobject, jstring);
-
- #ifdef __cplusplus
- }
- #endif
- #endif
4.0 打开DEV C++ 新建工程,在basic选项卡里选择DLL,将工程名填写为My,删除DEV产生的默认文件
5.0 将产生的My.h文件拷贝至 My工程 ,单击工程,右键新建一个My.cpp文件,实现My.h
-
-
- #include <windows.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include "My.h"
-
-
-
-
-
-
-
- JNIEXPORT jstring JNICALL Java_My_hello(JNIEnv *env,jobject obj,jstring pString)
- {
-
-
-
- const char *nativeString = env->GetStringUTFChars(pString, 0);
-
- printf("%s", nativeString);
-
-
-
- MessageBox (0,TEXT(nativeString), "Hi", MB_ICONINFORMATION);
-
-
- env->ReleaseStringUTFChars(pString, nativeString);
-
- return pString;
- }
这时候编译以上文件将会报错:jni.h找不到,别着急,我会告诉你怎么解决:
右键DEV My工程,选择工程属性----》文件/目录----》包含文件目录---》添加 C:\Program
Files\Java\jdk1.6.0_10\include和C:\Program Files\Java\jdk1.6.0_10\include\win32
[jdk的目录根据你的安装目录变动]
编译无语法错误的话将会产生:My.dll
6.0 将My.dll拷贝至My.class文件所在的目录
java My
将会输出:Hello和弹出window对话框:
最好的是增加一个StdAfx.h文件在,在My.cpp里include这个文件:
-
-
-
-
-
- #pragma once
-
-
-
- #ifndef WINVER // 允许使用特定于 Windows XP 或更高版本的功能。
- #define WINVER 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
- #endif
-
- #ifndef _WIN32_WINNT // 允许使用特定于 Windows XP 或更高版本的功能。
- #define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。
- #endif
-
- #ifndef _WIN32_WINDOWS // 允许使用特定于 Windows 98 或更高版本的功能。
- #define _WIN32_WINDOWS 0x0410 // 将此值更改为适当的值,以指定将 Windows Me 或更高版本作为目标。
- #endif
-
- #ifndef _WIN32_IE // 允许使用特定于 IE 6.0 或更高版本的功能。
- #define _WIN32_IE 0x0600 // 将此值更改为相应的值,以适用于 IE 的其他版本。
- #endif
-
- #define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
-
- #include <windows.h>
- #include <stdlib.h>
- #include <stdio.h>
-
-
DEV
C++在此下载 JNI将使java失去跨平台的功能,所以除非必要,你都应该尽量用java实现DLL文件里的功能!
JAVA 本地调用(JNI)之用dev c++简单实现,布布扣,bubuko.com
JAVA 本地调用(JNI)之用dev c++简单实现
标签:c style class blog java a
原文地址:http://www.cnblogs.com/czpblog/p/3760940.html