转自:http://blog.csdn.net/jjunjoe/article/details/6987183

一、关于JNI:
JNI(Java Native Interface):Java本地调用。JNI是
Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定被支持就可以了。

JNI也有它的缺陷:
1、潜在的安全隐患。
因为本机方法实行市级的机器代码,它有权使用主机的任何资源。也就是说,本机代码不受Java执行环境的限制。
2、丧失了可一致性。
因为本机代码是包含在动态库中的(Windows环境是DLL,其他环境如Linux也是对应的动态库.so)。它必须存在于执行Java程序的机器上。而且因为每一个本机方法都依赖于CPU和操作系统。这样一个运用本机方法的Java程序只能在一个已经安装了可兼容动态库的机器上运行。

二、JNI在Windows环境的实现:
1、在Java程序代码中对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。
这里我用eclipse建了一个Java项目,名为JniClient,里面就一个Java文件,在包com.test下,名为JniClient.java,内容如下:
package com.test;

public class JniClient {
    public static void main(String[] args) {

new JniClient().test("Hello, world!");
    }

static {
        System.loadLibrary("JniServer");
    }

public native void test(String instring);
}

2、编译JniClient工程。
1)在cmd命令行中,运行:javac JniClient
生成class文件JniClient.class
如果是用eclipse建工程,并且选上了自动编译选项,在bin/com/test目录下就已经有JniClient.class了,这步就不需要了。
2)在cmd命令行中,定位路径到工程的bin目录(如果不定位到这里就会出现无法访问错误,具体原因我就没有去查找了),运行:javah com.test.JniClient
这里因为我的JniClient.java是在com.test包中,要根据自己具体定义的包输入命令。
在bin目录下会生成.h头文件,在后面的动态库中需要用到这个头文件。我的示例生成的是:com_test_JniClient.h。
其代码内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_test_JniClient */

#ifndef _Included_com_test_JniClient
#define _Included_com_test_JniClient
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_test_JniClient
 * Method:    test
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_test_JniClient_test
  (JNIEnv *env, jobject arg, jstring instring);

#ifdef __cplusplus
}
#endif
#endif
注意:函数名称和自动生成的.h文件中规定的一致,命名规则是: Java_使用类_方法名,所以上面的方法名是:Java_com_test_JniClient_test。
然后注释说不要编辑这个头文件,其实编辑也没关系的,比如我看默认生成的函数名没带参数,就加上了,也不会有问题。原本是:
JNIEXPORT void JNICALL Java_com_test_JniClient_test
  (JNIEnv *, jobject, jstring);

3、创建动态库(我用的VC++6.0)。
1)新建一个空的动态库。
2)将JavaSDK安装目录下的jni.h,jni_md.h文件拷贝到工程目录下(我的jni.h文件在C:\Program
Files\Java\jdk1.6.0_14\include下面,jni_md.h文件在C:\Program
Files\Java\jdk1.6.0_14\include\win32下面,根据自己的安装目录去找。最好拷贝到VC的安装目录的Include目录下,比如我机器上的目录是:C:\Program
Files\Microsoft Visual
Studio\VC98\Include,这样以后所有的JNI要用到的这两个头文件都不用在工程中添加了)。
3)将com_test_JniClient.h头文件拷贝到工程目录下面。
4)完成com_test_JniClient.h对应的.cpp实现文件,比如com_test_JniClient.cpp,然后实现com_test_JniClient.h的函数。
#include "com_test_JniClient.h"
#include "myfunc.h"

JNIEXPORT void JNICALL Java_com_test_JniClient_test
  (JNIEnv *env, jobject arg, jstring instring)
{

const char *str = (const char *)env->GetStringUTFChars(instring, JNI_FALSE);
    printf("%s\n",str);
    testfunc(str);
    env->ReleaseStringUTFChars(instring,str);
    return;
}
在实现函数中,我还调用了另外一个C函数testfunc。
其头文件为myfunc.h,内容如下:
#ifdef __cplusplus
extern "C" {
#endif

void testfunc(const char *str);

#ifdef __cplusplus
}
#endif

其实现文件为myfunc.cpp,内容如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "myfunc.h"

void testfunc(const char *str)
{
    printf("str = %s\n",str);

return;
}

5)编译生成动态库JniServer.dll。

4、将动态库JniServer.dll拷贝到JniClient工程文件目录下面。
5、运行JniClient.class,控制台输出如下信息:
Hello, world!
str = Hello, world!

OK,Windows上Jni的实现到此完成,实际开发中要注意数据类型,考虑Java和VC的接口问题,用jint  jstring等。

【转载】Windows环境下JNI的实现实例的更多相关文章

  1. [转载]Windows环境下 Hadoop Error: JAVA_HOME is incorrectly set. 问题

    最近尝试在windows开发MR程序并且提交Job,在解压缩好hadoop,配置好环境变量后, 打开cmd 输入hadoop version 的时候出现以下错误: Error: JAVA_HOME i ...

  2. [原]我在Windows环境下的首个Libevent测试实例

    libevent对Windows环境也有很好的支持,不过初次学习和编译libevent简单实例,总是有一些陌生感的,只有成功编译并测试了一个实例,才会有恍然大悟的感觉.下面将要讲到的一个实例是我从网上 ...

  3. 4.windows环境下如何安装memcached教程(转载+自己整理)

     Memcached 是一个开源免费高性能的分布式内存对象缓存系统,能够加快网站访问速度和减轻数据库压力,本文向大家介绍下windows环境下如何安装memcached.百度经验:jingyan. ...

  4. Windows环境下修改Oracle实例监听IP地址

    Windows环境下修改Oracle实例监听IP地址. 配置文件路径:<ORACLE_HOME>\NETWORK\ADMIN 如:C:\Oracle11gR2\product\11.2.0 ...

  5. 【转】Windows环境下Android NDK环境搭建

    原文网址:http://www.metsky.com/archives/525.html 前面介绍Windows下Android 开发环境配置,主要是面向JAVA开发环境,对只做APK上层应用开发人员 ...

  6. Windows环境下Android NDK环境搭建

    前面介绍Windows下Android 开发环境配置,主要是面向JAVA开发环境,对只做APK上层应用开发人员来讲,基本够用了,由于Linux系统的权限限制和Android封装架构限制,很多涉及底层设 ...

  7. Windows环境下Android Studio v1.0安装教程

    Windows环境下Android Studio v1.0安装教程 准备工具 JDK安装包. 要求:JDK 7以及以上版本. Android Studio安装文件. Windows: exe(包含SD ...

  8. Windows环境下32位汇编语言程序设计(典藏版)

    Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)(年,经典再现!) 罗云彬 著 ISBN 978-7-121-20759-4 2013年7月出版 定价:99.00元 756页 1 ...

  9. Windows环境下Redis

    Redis 是一个高性能的key-value数据库, 使用内存作为主存储,数据访问速度非常快,当然它也提供了两种机制支持数据持久化存储.比较遗憾的是,Redis项目不直接支持Windows,Windo ...

随机推荐

  1. 《Photoshop 2020》初心版_v6 21.0.2.57

    <Phtoshop 2020>初心版_v6 下载地址(5245) SHA1:E926A1B99D147A27A44050A5BCE2E69E2CDAEEAE 版本信息    发行版本 20 ...

  2. react-发表评论案例

    评论列表组件 import React from 'react' import CMTItem from './CmtItem.jsx' import CMTBox from './CmtBox.js ...

  3. 假期学习【九】首都之窗百姓信件爬取代码优化以及处理 2020.2.7 Python

    今天对爬取程序进行了优化,修正了错误. 遇到了两个问题与错误: 1.忘记了对文件的读写设置格式,导致导入Hive数据库无法正常显示以及写入. 2.文件的读写操作有误导致数据量仅有应该有的1/2 不完整 ...

  4. maven通过pom文件下载相关依赖包的网址

    下载有关依赖插件的网址去MVNREPOSITORY仓库寻找对应的版本然后添加到pom文件中就可以自动下载了 网址为:https://mvnrepository.com

  5. linux - 从网上下载文件到服务器

    命令格式 wget URL地址 实例 wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.33-linux-glibc2.5-x86 ...

  6. 占位 SC

    占位 SC include: SC404 SC405

  7. 1级迁移类Q101-Oracle ASM 迁移文件系统(File System)非公

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  8. MFC使用LoadBitmap方法加载位图文件失败解决方案(转)

    用如下方法在原项目中使用LoadBitmap方法加载已有的位图资源作为背景没有问题,但放在别的项目中总是加载不出来,该函数返回NULL HBITMAP hBitmap=LoadBitmap((HINS ...

  9. IDEA配置tomcat日志乱码

    第一步(tomcat7/8) tomcat:找到tomcat文件夹下的conf文件夹,去修改里面的logging.properties文件 两种修改方式(第一种方法不行再用第二种): 将文件中的5个U ...

  10. docker部署java应用程序

    https://docs.docker.com/get-started/ 安装docker   1.安装docker  apt install docker 2.配置docker加速器 安装完成后在 ...