java JNI 实例 实现调用c++函数

JAVA JNI实例编写


   1、JN的书写步骤

  1. 编写带有native声明的方法的java类,生成.java文件
  2. 使用javac命令编译所编写的java类,生成.class文件
  3. 使用javah -jni java类名生成扩展名为h的头文件,也即生成.h文件
  4. 使用C/C++(或者其他编程想语言)实现本地方法,创建.h文件的实现,也就是创建.cpp文件实现.h文件中的方法
  5. 将C/C++编写的文件生成动态连接库,生成dll文件

2、JNI实例

下列是所有操作都是在目录: 为了方便可以不包括类名,这个地方测试时包括类名的ying.zhang.jni

3.1.编写带有native声明的方法的java类:HelloWorldJNI.java

[java]  view plain  copy
  1. package ying.zhang.jni;
    
    /**
     * Created by shaochangying on 2017/2/25.
     */
    public class HelloWorldJNI {
        public native void displayHelloWorld();//
    
        static {
            System.loadLibrary("./lib/HelloWorldJNIImpl");//
        }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            HelloWorldJNI helloWorld = new HelloWorldJNI();
            helloWorld.displayHelloWorld();
        }
    }

3.2.使用javac命令编译所编写的java类

[java]  view plain  copy
执行完上述命令以后生成 E:\works\idea\study\src\ying\zhang\jni\HelloWorldJNI.class文件

3.3.使用javah -jni java类名生成扩展名为h的头文件


注意:这个地方要到包名外执行命令,如果在class目录下执行会报错



正确的路径和写法
[java]  view plain  copy
  1. E:\works\idea\study\src>javah -jni ying.zhang.jni.HelloWorldJNI
执行完上述命令以后生成 E:\works\idea\study\src\ying_zhang_jni_HelloWorldJNI.h文件,该文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ying_zhang_jni_HelloWorldJNI */


#ifndef _Included_ying_zhang_jni_HelloWorldJNI
#define _Included_ying_zhang_jni_HelloWorldJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     ying_zhang_jni_HelloWorldJNI
 * Method:    displayHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_ying_zhang_jni_HelloWorldJNI_displayHelloWorld
  (JNIEnv *, jobject);


#ifdef __cplusplus
}
#endif
#endif

这里我们可以这样理解:这个h文件相当于我们在java里面的接口,这里声明了一个 JNICALL Java_ying_zhang_jni_HelloWorldJNI_displayHelloWorld
  (JNIEnv *, jobject);;方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致

3.4.使用C/C++实现本地方法

创建HelloWorldJNIImpl.cpp,代码如下所示:
[java]  view plain  copy
  1. #include "ying_zhang_jni_HelloWorldJNI.h"
    #include <stdio.h>
    #include "jni.h"
    /* 
     * Class:     ying_zhang_jni_HelloWorldJNI 
     * Method:    displayHelloWorld 
     * Signature: ()V 
     */  
    JNIEXPORT void JNICALL Java_ying_zhang_jni_HelloWorldJNI_displayHelloWorld  
      (JNIEnv *, jobject)  
     {  
        printf("Hello World!\n");  
        return;  
    }

3.5.将C/C++编写的文件生成动态连接库

D:\Program Files\Java\jdk1.6.0_26\include\jni.hD:\Program Files\Java\jdk1.6.0_26\include\win32\jni_md.h这两个文件拷贝到 E:\works\idea\study\src目录下。目录结构如下图所示:



3.7 执行   得到HelloWorldJNIImpl.dll文件

我使用的是visual studio 2010,要使用其中的cl命令,必须打开visual studio 命令行,如下图所示:



然后再命令行中输入如下命令


注意:这个是时候可能报错,如图所示


这是由于jni.h 你在.h和.app文件里面应用为<jni.h>格式,这种格式是系统引用,你现在是在同目录下面,应该改为"jni.h”这种方式
具体如下图所示:

执行完上述命令以后,我们在C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC可以看到生成的四个文件,分别是:



将其中的HelloWorldJNIImpl.dll拷贝到 目录下。

3.8.执行class得到结果

在cmd中运行:
[java]  view plain  copy
package ying.zhang.jni;

/**
 * Created by shaochangying on 2017/2/25.
 */
public class HelloWorldJNI {
    public native void displayHelloWorld();//

    static {
        System.loadLibrary("./lib/HelloWorldJNIImpl");//
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HelloWorldJNI helloWorld = new HelloWorldJNI();
        helloWorld.displayHelloWorld();
    }
}

具体如下图所示:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值