JAVA 本地调用(JNI)之用dev c++简单实现

笔者在最近的项目中需要用JNI,调用C/C++编好的程序,由于此前对JNI不熟悉,在网上找了好多都是基于VC或者VS2008系列实现的,这样为了实现一个简单的调用,需要装几百兆的VC或者几个G的VS很麻烦,由于此前我一直用的dev
C++做C的开发(这个DEV很小巧,功能很强大,只是自动补全不友好),于是决定就采用DEV实现JNI的本地文件的编译:步骤如下:

1.0 编写java类

[java] view plaincopy

  1. public class My{
  2. public native String hello(String arg);

  3. static{

  4. System.loadLibrary("My");

  5. }

  6. public static void main(String[] args)

  7. {

  8. new My().hello("Hello");

  9. }

  10. }

2.0 编译该java文件:javac -cp My.java

3.0 产生头文件: javah -jni My            
 将会在目录下产生My.h的头文件

[cpp] view plaincopy

  1. //My.h
  2. /* DO NOT EDIT THIS FILE - it is machine generated */

  3. #include <jni.h>

  4. /* Header for class My */
  5. #ifndef _Included_My

  6. #define _Included_My

  7. #ifdef __cplusplus

  8. extern "C" {

  9. #endif

  10. /*

  11. * Class:     My

  12. * Method:    hello

  13. * Signature: (Ljava/lang/String;)Ljava/lang/String;

  14. */

  15. JNIEXPORT jstring JNICALL Java_My_hello

  16. (JNIEnv *, jobject, jstring);
  17. #ifdef __cplusplus

  18. }

  19. #endif

  20. #endif

4.0 打开DEV C++ 新建工程,在basic选项卡里选择DLL,将工程名填写为My,删除DEV产生的默认文件

5.0 将产生的My.h文件拷贝至 My工程 ,单击工程,右键新建一个My.cpp文件,实现My.h

[cpp] view plaincopy

  1. //My.cpp
  2. #include <windows.h>

  3. #include <stdlib.h>

  4. #include <stdio.h>

  5. #include "My.h"
  6. /*

  7. * Class:     My

  8. * Method:    hello

  9. * Signature: (Ljava/lang/String;)Ljava/lang/String;

  10. */

  11. JNIEXPORT jstring JNICALL Java_My_hello(JNIEnv *env,jobject obj,jstring pString)

  12. {
  13. //从jstring中获取本地方法传递的字符串
  14. const char *nativeString = env->GetStringUTFChars(pString, 0);
  15. printf("%s", nativeString);
  16. //弹出window对号框
  17. MessageBox (0,TEXT(nativeString), "Hi", MB_ICONINFORMATION);
  18. //DON‘T FORGET THIS LINE!!!

  19. env->ReleaseStringUTFChars(pString, nativeString);
  20. return pString;

  21. }

这时候编译以上文件将会报错: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这个文件:

[cpp] view plaincopy

  1. // stdafx.h : 标准系统包含文件的包含文件,

  2. // 或是经常使用但不常更改的

  3. // 特定于项目的包含文件

  4. //
  5. #pragma once
  6. // 如果必须将位于下面指定平台之前的平台作为目标,请修改下列定义。

  7. // 有关不同平台对应值的最新信息,请参考 MSDN。

  8. #ifndef WINVER              // 允许使用特定于 Windows XP 或更高版本的功能。

  9. #define WINVER 0x0501       // 将此值更改为相应的值,以适用于 Windows 的其他版本。

  10. #endif
  11. #ifndef _WIN32_WINNT        // 允许使用特定于 Windows XP 或更高版本的功能。

  12. #define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。

  13. #endif
  14. #ifndef _WIN32_WINDOWS      // 允许使用特定于 Windows 98 或更高版本的功能。

  15. #define _WIN32_WINDOWS 0x0410 // 将此值更改为适当的值,以指定将 Windows Me 或更高版本作为目标。

  16. #endif
  17. #ifndef _WIN32_IE           // 允许使用特定于 IE 6.0 或更高版本的功能。

  18. #define _WIN32_IE 0x0600    // 将此值更改为相应的值,以适用于 IE 的其他版本。

  19. #endif
  20. #define WIN32_LEAN_AND_MEAN     // 从 Windows 头中排除极少使用的资料

  21. // Windows 头文件:

  22. #include <windows.h>

  23. #include <stdlib.h>

  24. #include <stdio.h>
  25. // TODO: 在此处引用程序需要的其他头文件

DEV
C++在此下载
 JNI将使java失去跨平台的功能,所以除非必要,你都应该尽量用java实现DLL文件里的功能!

时间: 2024-10-05 05:02:22

JAVA 本地调用(JNI)之用dev c++简单实现的相关文章

(转)java 层调用Jni(Ndk) 持久化c c++ 对象

对于Jni(Ndk) 很多人应该都有印象,Android的ndk接触到的机会相对会比较多,本例子以android平台为例,pc端的话就以简单的windows为例, 编码完用vs 或是 gcc进行编译成dll文件,扔到系统system32 , 就是环境变量配置的文件夹底下,linux 可能也差不多是这个意思,剩下的代码就跟android一样,进行加载这个动态链接库即可. 这里就不做赘述,直接进入android平台的ndk开发,这里就主要讲下,Java层如何持久化c c++ 对象,场景可以是这样,假

本地调用jni之VC++无法导入问题

事实上非常easy,无法导入头文件就自己新建呗 1. 首先编写java代码 class Vrv { public native void printVersion(); static { System.loadLibrary("hadoop"); } public static void main(String[] args) { new Vrv().printVersion(); } } 2. 编译Vrv 3. 然后 4. 结果例如以下 5. 在VC++中新建projecthadoo

Windows环境下教你用Eclipse ADT 插件生成.h/.so文件,Java下调用JNI,轻松学习JNI

准备工作:Eclipse ADT IDE 开发工具,NDK ,Java 环境,博主的配置是:Windows x86 , ADT Build: v22.3.0-887826 , JAVA 1.7, NDK  android-ndk-r9 首先我们需要知道在 Linux 下编译 Project 生成 so 可以用 make ,但是在 WINDOWS 就不行了,这个就不多说了,大伙都明 白,然而今天写的这篇博客就是教大家怎么在Windows 配置自己的ADT开发插件也具备这样的功能,方便快速高效的开发

Java本地文件操作(六)文件的简单读写

package com.yeqc.rwfile; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java

Java採用JNI调用VC++生成的dll(Java与C++交互)

应项目需求,须要android调用java,java再调用C++实现android一个图片匹配的功能,我们作为java组须要和C++和Android进行交互.以下是java和C++採用JNI的方式进行接口传參交互,我做的一个demo并执行成功. 什么是JNI? JNI全拼是Java Native Interface,中文意思为Java本地调用.JNI标准是Java平台的一部分.它同意java和其它语言的代码进行交互.JNI開始是为了本地已经编译好的语言,尤其是C和C++而设计的.我们也能够使用J

java native interface JNI 调用Java方法

在上一篇文章中介绍了JNI,以及java调用JNI,这篇讲一下 JNI调用java方法. 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instance)的域,调用静态(static)和实例(instance)函数.JNI通过ID识别域和方法,一个域或方法的ID是任何处理域和方法的函数的必须参数. 下表列出了用以得到静态(static)和实例(instance)的域与方法的JNI函数.每个函数接受(作为参数)域或方法的类,它们的名称,符号和它们对

JNI编程(二) —— 让C++和Java相互调用(1)

自己在外面偷偷的算了下,又有将近两个月没更新过blog了.趁着今天有兴致,来更新JNI编程的第二篇文章.在第一篇里,大概介绍了JNI的特点.用途和优劣.并且做一个最简单的JNI的例子,不过说实话那个例子在实际的开发中没有太大的价值,实际开发中所需要的JNI程序要远远比那个复杂.所以这一篇就来介绍下如何通过JNI实现java和C++的相互通信,来满足实际开发的需要. 所谓”通信“,其实说白了无非也就是我们所说的方法调用,在上一篇的例子里介绍了如何在Java中调用本地的DLL,其实在Java代码中,

Java调用JNI

因为要做点图形处理的项目,需要在Java中调用dll库,所以开发的第一步是研究了一下Java Jni的使用方法.话不多说,使用方法如下: 1.新建一个Java项目,比方说我的项目新建后结构是: 2.上面新建的项目,我们要用的是JTest这个类,其他类可有可无(只是自己原先的项目代码懒得删~),其中,我们定义了一个方法名字,叫做sayHello(),注意,前边还有关键字  nativie 3.定位到工程目录路径,使用命令行工具,生成.class文件. 比如我的工作区间是在 此时使用javah命令生

Android调用JNI本地方法经过有点改变

方法注册好后要经过哪些路 Android一个异常捕获项目 https://github.com/xroche/coffeecatch coffeecatch CoffeeCatch, a tiny native POSIX signal catcher (especially useful for JNI code on Android/Dalvik, but it can be used in non-Java projects) It allows to "gracefully"