• JNI简单示例


    笔者在最近的项目中需要用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的头文件

    //My.h
    
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class My */
    
    #ifndef _Included_My
    #define _Included_My
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     My
     * Method:    hello
     * Signature: (Ljava/lang/String;)Ljava/lang/String;
     */
    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

    //My.cpp
    
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include "My.h"
    
    
    /*
     * Class:     My
     * Method:    hello
     * Signature: (Ljava/lang/String;)Ljava/lang/String;
     */
    JNIEXPORT jstring JNICALL Java_My_hello(JNIEnv *env,jobject obj,jstring pString)
    {
    
      //从jstring中获取本地方法传递的字符串   
        
         const char *nativeString = env->GetStringUTFChars(pString, 0);     
        
         printf("%s", nativeString);     
         
    	  //弹出window对号框
    
    	 MessageBox (0,TEXT(nativeString), "Hi", MB_ICONINFORMATION);
        
         //DON'T FORGET THIS LINE!!!     
         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这个文件:

    // stdafx.h : 标准系统包含文件的包含文件,
    // 或是经常使用但不常更改的
    // 特定于项目的包含文件
    //
    
    #pragma once
    
    // 如果必须将位于下面指定平台之前的平台作为目标,请修改下列定义。
    // 有关不同平台对应值的最新信息,请参考 MSDN。
    #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 头中排除极少使用的资料
    // Windows 头文件:
    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    // TODO: 在此处引用程序需要的其他头文件
    

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

  • 相关阅读:
    No result defined for action
    敏捷管理视频
    如何预测一个互联网产品的未来:一套关于产品的数学模型
    ZooKeeper 笔记(3) 实战应用之【统一配置管理】
    mybatis migrate常用指令
    dubbo远程调试运行
    解决 nginx https反向代理http协议 302重定向localtion到http问题
    nginx设置不使用缓存 add_header Cache-Control no-cache
    openssl数字证书私钥删除私钥密码
    读 Zepto 源码系列
  • 原文地址:https://www.cnblogs.com/czpblog/p/3134598.html
Copyright © 2020-2023  润新知