zoukankan      html  css  js  c++  java
  • 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.   
    3.   public native String hello(String arg);  
    4.   static{  
    5.     System.loadLibrary("My");  
    6. }  
    7.  public static void main(String[] args)  
    8. {  
    9.       new My().hello("Hello");  
    10. }  
    11. }  

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

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

    [cpp] view plaincopy
     
    1. //My.h  
    2.   
    3. /* DO NOT EDIT THIS FILE - it is machine generated */  
    4. #include <jni.h>  
    5. /* Header for class My */  
    6.   
    7. #ifndef _Included_My  
    8. #define _Included_My  
    9. #ifdef __cplusplus  
    10. extern "C" {  
    11. #endif  
    12. /* 
    13.  * Class:     My 
    14.  * Method:    hello 
    15.  * Signature: (Ljava/lang/String;)Ljava/lang/String; 
    16.  */  
    17. JNIEXPORT jstring JNICALL Java_My_hello  
    18.   (JNIEnv *, jobject, jstring);  
    19.   
    20. #ifdef __cplusplus  
    21. }  
    22. #endif  
    23. #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.   
    3. #include <windows.h>  
    4. #include <stdlib.h>  
    5. #include <stdio.h>  
    6. #include "My.h"  
    7.   
    8.   
    9. /* 
    10.  * Class:     My 
    11.  * Method:    hello 
    12.  * Signature: (Ljava/lang/String;)Ljava/lang/String; 
    13.  */  
    14. JNIEXPORT jstring JNICALL Java_My_hello(JNIEnv *env,jobject obj,jstring pString)  
    15. {  
    16.   
    17.   //从jstring中获取本地方法传递的字符串     
    18.       
    19.      const char *nativeString = env->GetStringUTFChars(pString, 0);       
    20.       
    21.      printf("%s", nativeString);       
    22.        
    23.       //弹出window对号框  
    24.   
    25.      MessageBox (0,TEXT(nativeString), "Hi", MB_ICONINFORMATION);  
    26.       
    27.      //DON'T FORGET THIS LINE!!!       
    28.      env->ReleaseStringUTFChars(pString, nativeString);       
    29.       
    30.      return pString;     
    31. }  

    这时候编译以上文件将会报错:jni.h找不到,别着急,我会告诉你怎么解决:

    右键DEV My工程,选择工程属性----》文件/目录----》包含文件目录---》添加 C:Program FilesJavajdk1.6.0_10include和C:Program FilesJavajdk1.6.0_10includewin32  [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.   
    6. #pragma once  
    7.   
    8. // 如果必须将位于下面指定平台之前的平台作为目标,请修改下列定义。  
    9. // 有关不同平台对应值的最新信息,请参考 MSDN。  
    10. #ifndef WINVER              // 允许使用特定于 Windows XP 或更高版本的功能。  
    11. #define WINVER 0x0501       // 将此值更改为相应的值,以适用于 Windows 的其他版本。  
    12. #endif  
    13.   
    14. #ifndef _WIN32_WINNT        // 允许使用特定于 Windows XP 或更高版本的功能。  
    15. #define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。  
    16. #endif                        
    17.   
    18. #ifndef _WIN32_WINDOWS      // 允许使用特定于 Windows 98 或更高版本的功能。  
    19. #define _WIN32_WINDOWS 0x0410 // 将此值更改为适当的值,以指定将 Windows Me 或更高版本作为目标。  
    20. #endif  
    21.   
    22. #ifndef _WIN32_IE           // 允许使用特定于 IE 6.0 或更高版本的功能。  
    23. #define _WIN32_IE 0x0600    // 将此值更改为相应的值,以适用于 IE 的其他版本。  
    24. #endif  
    25.   
    26. #define WIN32_LEAN_AND_MEAN     // 从 Windows 头中排除极少使用的资料  
    27. // Windows 头文件:  
    28. #include <windows.h>  
    29. #include <stdlib.h>  
    30. #include <stdio.h>  
    31.   
    32. // TODO: 在此处引用程序需要的其他头文件  

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

  • 相关阅读:
    Python之CVXOPT模块
    JavaScript之读取和写入cookie
    jQuery学习(2)ajax()使用
    JavaScript之使用AJAX(适合初学者)
    Jquery焦点图实例
    jquery-mobile表单提交问题
    程序员笔记|Spring IoC、面向切面编程、事务管理等Spring基本概念详解
    使用什么调试swoole程序
    swoole模块的编译安装:php编译安装swoole模块的代码
    TP5使用Redis处理电商秒杀
  • 原文地址:https://www.cnblogs.com/czpblog/p/3760940.html
Copyright © 2011-2022 走看看