基于JNI,JAVA 调用 C++入门

1.步骤一览

image

2.步骤详情

2.1. 编写Java类 native

package com.ibugs.jni;

/**
 * 
 * @author i_bugs
 * 
 */
public class CProcessor {

    // 声明native方法
    public native boolean checkValid();
    public native String processData(String str);
}

 

2.2.编译Class

首先编译CProcessor类,得到CProcessor.class

 

2.3.生成头文件

然后生成对应头文件com_ibugs_jni_CProcessor.h, 在cmd窗口下,命令:javah com.ibugs.jni.CProcessor

以下是头文件中的内容:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ibugs_jni_CProcessor */

#ifndef _Included_com_ibugs_jni_CProcessor
#define _Included_com_ibugs_jni_CProcessor
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_ibugs_jni_CProcessor
 * Method:    checkValid
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_com_ibugs_jni_CProcessor_checkValid
  (JNIEnv *, jobject);

/*
 * Class:     com_ibugs_jni_CProcessor
 * Method:    processData
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_ibugs_jni_CProcessor_processData
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

其中,Java_com_ibugs_jni_CProcessor_checkValid (JNIEnv *, jobject),Java_com_ibugs_jni_CProcessor_processData (JNIEnv *, jobject, jstring)这两个方法需要我们用C++来实现

2.4.C++实现本地方法

这里借助Visual Studio2012,新建项目

image

在Application Settings设置Appliction Type中,请选择DLL, Addition options 选择Empty project选项如下

image

Source Files目录新建CProcessor.cpp文件,用来实现Java要调用的方法

#include "com_ibugs_jni_CProcessor.h"

JNIEXPORT jboolean JNICALL Java_com_ibugs_jni_CProcessor_checkValid
    (JNIEnv *, jobject){
        return true;
}

JNIEXPORT jstring JNICALL Java_com_ibugs_jni_CProcessor_processData
  (JNIEnv *, jobject, jstring str){
      return str;
}
其中第一行则为生成的头文件,同时还需要jni.h及jni_md.h,这两个文件可以在tomcat的安装目录下找到,分别在JAVA_HOME/include及JAVA_HOME/include/win32下,将这些文件引入到项目中

2.5.编译动态链库

设置编译的机器位数32位或者64位,右击项目Property进入Configuration Manager窗口这里可以调整编辑Dll的位数不再赘述

image

然后build工程即可。则在项目工程目录中找到CProcessor.dll文件

2.6.加载调用动态链库

package com.ibugs.jni;

public class TestCProcessor {

    // 加载动态链库
    static {
        System.loadLibrary("CProcessor");
    }

    public static void main(final String[] args) {

        CProcessor cProcessor = new CProcessor();

        System.out.println("checkValid()result:" + cProcessor.checkValid());
        System.out.println("processData()result:"
                + cProcessor.processData("hello"));
    }
}

注意:要将CProcessor.dll放入java.library.path,我这里将动态链库直接放到Windows/System32下面,否则无法加载。在loadLibrary时,不需要写明后缀.dll

3.小结

在用JNI调用C++过程中主要就是生成native方法对应的头文件,然后用C/C++实现头文件中的方法,编译成DLL动态链库就可以调用了。

posted on 2014-02-28 14:11  i_bugs  阅读(620)  评论(0编辑  收藏  举报

导航