转自: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. 关于Windows系统下端口被占用的问题和task命令

    一.如何解决端口被占用的问题? 此时端口4444被进程占用,只要找到端口4444的进程,并且将进程kill掉即可. 开始--运行--cmd 进入命令提示符 输入netstat -aon 即可看到所有连 ...

  2. Android中的内存管理机制以及正确的使用方式

    概述 从操作系统的角度来说,内存就是一块数据存储区域,属于可被操作系统调度的资源.现代多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源,所以可以从两方面来理解操 ...

  3. 封装 axios

    大家是否有印象,在开发项目中,我们往往会把axios给封装起来,写在一个js文件夹里,最后引入的也是js文件夹,而不是直接对axios进行操作,那为什么? 1. 如果一个组件需要请求数据,就要用到ax ...

  4. Codeforce 515A - Drazil and Date

    Someday, Drazil wanted to go on date with Varda. Drazil and Varda live on Cartesian plane. Drazil's ...

  5. Codeforce 25A - IQ test (唯一奇偶)

    Bob is preparing to pass IQ test. The most frequent task in this test is to find out which one of th ...

  6. VScode usage

    Common settings editor.minimap.enabled     //close the preview workbench.editor.show tabs  // show f ...

  7. [USACO10MAR] 伟大的奶牛聚集 - 树形dp

    每个点有重数,求到所有点距离最小的点 就是魔改的重心了 #include <bits/stdc++.h> using namespace std; #define int long lon ...

  8. execute、executeUpdate、executeQuery的区别

    链接:https://blog.csdn.net/u012501054/article/details/80323176 链接:https://blog.csdn.net/CNAHYZ/article ...

  9. Java后端知识体系及路线【最新秘籍】

    第一层(基本语法)   第一层心法,主要都是基本语法,程序设计入门,悟性高者十天半月可成,差一点的 3 到 6 个月也说不准.如果有其他开发语言的功底相助,并且有张无忌的悟性与运气,相信第一层只在片刻 ...

  10. Selenium原理

      from selenium import webdriver:导入webdriver模块 当导入webdriver模块时,会执行\selenium\webdriver目录下的__init__.py ...