JAVA JNI

http://blog.csdn.net/hbcui1984/archive/2009/12/10/4980805.aspx

一、概述

JNI(java native interface),JAVA本地接口调用,目的是为了JAVA可以调用本地程序,主要优点有:
提高效率,解决性能问题
防止反编译,提高核心代码安全性
增强本机接口调用
嵌入式开发应用
    如下通过一个最简单的小demo,演示如何进行jni开发。
二、demo演示
1. 新建JAVA文件
新建一个java类,如下:
view plaincopy to clipboardprint?
package chb.test.jni;  
public class HelloJni {  
        public native void sayHello();    
            
    static {    
        System.loadLibrary("hellojni");    
    }    
    
    public static void main(String[] args) {    
        new HelloJni().sayHello();    
    }    

package chb.test.jni;
public class HelloJni {
        public native void sayHello(); 
         
    static { 
        System.loadLibrary("hellojni"); 
    } 
 
    public static void main(String[] args) { 
        new HelloJni().sayHello(); 
    } 
}
 HelloJni.java在硬盘上的位置:D:/workspace/MyWork/src/chb/test/jni/HelloJni.java
 
2. 生成class文件
1) 利用javac命令进行编译,进入D:/workspace/MyWork/src/chb/test/jni目录,利用
view plaincopy to clipboardprint?
javac HelloJni.java 
javac HelloJni.java
2) 利用IDE,例如我利用eclipse开发,自动编译,编译后的文件位于:D:/workspace/MyWork/bin/chb/test/jni目录下
 
3. 生成C头文件
1) 如果利用javac命令编译,则进入D:/workspace/MyWork/src目录,然后输入
view plaincopy to clipboardprint?
javah -jni chb.test.jni.HelloJni 
javah -jni chb.test.jni.HelloJni
会在D:/workspace/MyWork/src目录下发现新生成的头文件:chb_test_jni_HelloJni.h,文件内容如下:
view plaincopy to clipboardprint?
/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h>  
/* Header for class chb_test_jni_HelloJni */ 
#ifndef _Included_chb_test_jni_HelloJni  
#define _Included_chb_test_jni_HelloJni  
#ifdef __cplusplus  
extern "C" {  
#endif  
/* 
 * Class:     chb_test_jni_HelloJni 
 * Method:    displayHelloJni 
 * Signature: ()V 
 */ 
JNIEXPORT void JNICALL Java_chb_test_jni_HelloJni_displayHelloJni  
  (JNIEnv *, jobject);  
#ifdef __cplusplus  
}  
#endif  
#endif 
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class chb_test_jni_HelloJni */
#ifndef _Included_chb_test_jni_HelloJni
#define _Included_chb_test_jni_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     chb_test_jni_HelloJni
 * Method:    displayHelloJni
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_chb_test_jni_HelloJni_displayHelloJni
  (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
 
2) 如果利用IDE编译,则直接在编译根目录使用javah命令即可,例如进入:D:/workspace/MyWork/bin,然后使用
view plaincopy to clipboardprint?
javah -jni chb.test.jni.HelloJni 
javah -jni chb.test.jni.HelloJni
效果相同。
 
注意:因为HelloJni是在chb.test.jni包中的,因此需要写明全路径,否则如果直接到目录:D:/workspace/MyWork/bin/chb/test/jni,然后执行javah HelloJni,会报出异常,如下:
view plaincopy to clipboardprint?
D:/workspace/ctcc/MyWork/src/chb/test/jni>javah HelloJni  
错误:无法访问 HelloJni  
错误的类文件: ./HelloJni.class 
类文件包含错误的类: chb.test.jni.HelloJni  
请删除该文件或确保该文件位于正确的类路径子目录中。  
com.sun.tools.javac.util.Abort  
        at com.sun.tools.javac.comp.Check.completionError(Check.java:164)  
        at com.sun.tools.javadoc.DocEnv.loadClass(DocEnv.java:149)  
        at com.sun.tools.javadoc.RootDocImpl.<init>(RootDocImpl.java:77)  
        at com.sun.tools.javadoc.JavadocTool.getRootDocImpl(JavadocTool.java:159 
)  
        at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:330)  
        at com.sun.tools.javadoc.Start.begin(Start.java:128)  
        at com.sun.tools.javadoc.Main.execute(Main.java:66)  
        at com.sun.tools.javah.Main.main(Main.java:147)  
javadoc: 错误 - 致命错误  
2 错误 
D:/workspace/ctcc/MyWork/src/chb/test/jni>javah HelloJni
错误:无法访问 HelloJni
错误的类文件: ./HelloJni.class
类文件包含错误的类: chb.test.jni.HelloJni
请删除该文件或确保该文件位于正确的类路径子目录中。
com.sun.tools.javac.util.Abort
        at com.sun.tools.javac.comp.Check.completionError(Check.java:164)
        at com.sun.tools.javadoc.DocEnv.loadClass(DocEnv.java:149)
        at com.sun.tools.javadoc.RootDocImpl.<init>(RootDocImpl.java:77)
        at com.sun.tools.javadoc.JavadocTool.getRootDocImpl(JavadocTool.java:159
)
        at com.sun.tools.javadoc.Start.parseAndExecute(Start.java:330)
        at com.sun.tools.javadoc.Start.begin(Start.java:128)
        at com.sun.tools.javadoc.Main.execute(Main.java:66)
        at com.sun.tools.javah.Main.main(Main.java:147)
javadoc: 错误 - 致命错误
2 错误
 4. 新建C实现,并生成dll文件
新建c工程,本人利用dev c++,源代码如下:
view plaincopy to clipboardprint?
#include <windows.h>  
#include <stdio.h>  
#include <stdlib.h>  
#include <jni.h>    
#include "HelloJni.h"   
JNIEXPORT void JNICALL Java_chb_test_jni_HelloJni_sayHello(JNIEnv * a, jobject b)  
{    
    printf("hello Jni!/n");    
    return;    

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <jni.h> 
#include "HelloJni.h"
JNIEXPORT void JNICALL Java_chb_test_jni_HelloJni_sayHello(JNIEnv * a, jobject b)

    printf("hello Jni!/n"); 
    return; 
}
 方法很简单,就输出一句话,然后编译工程,生成hellojni.dll,并且将hellojni.dll拷贝到windows/system32目录下
 5. 执行java代码
运行HelloJni的main方法,输出"hello Jni",运行成功

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hbcui1984/archive/2009/12/10/4980805.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值