使用 Jni 调用 Dll 的实现(使用VS2008 生成Dll)_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > 使用 Jni 调用 Dll 的实现(使用VS2008 生成Dll)

使用 Jni 调用 Dll 的实现(使用VS2008 生成Dll)

 2012/1/13 9:07:09  h271665724  程序员俱乐部  我要评论(0)
  • 摘要:前言-----------------------本前言来自网络--------------------------JNI技术的出现主要是基于三个方面的应用需求:1.解决性能问题2.解决本机平台接口调用问题3.嵌入式开发应用-------------------------前言结束--------------------------------下面动手来实现使用Jni调用本地方法,本实例演示Java调用Native本地方法传递参数并且返回结果。具体内容如下:第一步
  • 标签:实现 使用

前言

-----------------------本前言来自网络--------------------------

JNI技术的出现主要是基于三个方面的应用需求:

1. 解决性能问题?

2. 解决本机平台接口调用问题

3. 嵌入式开发应用
-------------------------前言结束--------------------------------

?

下面动手来实现使用Jni调用本地方法,本实例演示 Java 调用 Native 本地方法传递参数并且返回结果。具体内容如下:

?

第一步:编写Java端代码

定义一个Java类

----------------------------------------------

public class TestNativeDemo { 
  
    // 声明本地方法 
    public native String testJni(String arg); 
  
    static { 
        // 加载DLL文件 
        System.loadLibrary("TestNativeDemoCPP"); 
    } 
  
    public static void main(String args[]) { 
        TestNativeDemo ob = new TestNativeDemo(); 
        // 调用本地方法 
        String result = ob.testJni("Hello,Jni"); // call a native method 
        System.out.println("TestNativeDemo.testJni=" + result); 
    } 
}

?

----------------------------------------------

编译之后在生成TestNativeDemo.class的bin目录下执行javah TestNativeDemo命令生成头文件TestNativeDemo.h

----------------------------------------------

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h> 
/* Header for class TestNativeDemo */
  
  
#ifndef _Included_TestNativeDemo //避免重复包含头文件  
#define _Included_TestNativeDemo 
#ifdef __cplusplus //c++编译环境中才会定义__cplusplus  
extern "C" { //告诉编译器下面的函数是c语言函数(因为c++和c语言对函数的编译转换不一样,主要是c++中存在重载)   
  
#endif 
/* 
 * Class:     TestNativeDemo 
 * Method:    testJni 
 * Signature: (Ljava/lang/String;)Ljava/lang/String; 
 */
JNIEXPORT jstring JNICALL Java_TestNativeDemo_testJni 
  (JNIEnv *, jobject, jstring); 
  
#ifdef __cplusplus 
} 
#endif 
#endif
?

----------------------------------------------

?

第二步:生成DLL库

1. 打开VS2008,创建一个名称为TestNativeDemoCpp的C++ Win32项目。在向导的应用程序类型处选择DLL,点完成。设置Release+Win32编译配置。

2. 将签名生成的TestNativeDemo.h文件拷贝到TestNativeDemoCpp项目的根目录下,然后在VS中右键头文件文件夹添加现有项把这个头文件包含进来,接下来就是编辑TestNativeDemoCpp.cpp文件。

----------------------------------------------

// TestNativeDemoCpp.cpp : 定义 DLL 应用程序的导出函数。 
#include "stdafx.h" 
  
#include <jni.h> 
#include "TestNativeDemo.h" 
#include <stdio.h> 
  
  
JNIEXPORT jstring JNICALL Java_TestNativeDemo_testJni (JNIEnv *env,jobject obj,jstring pString){ 
  
    //从jstring中获取本地方法传递的字符串 
  
     const char *nativeString = env->GetStringUTFChars(pString, 0);   
  
     printf("%s", nativeString);   
  
     //DON'T FORGET THIS LINE!!!   
     env->ReleaseStringUTFChars(pString, nativeString);   
  
     return pString; 
}
?

----------------------------------------------

3. VS开发环境默认不会识别jni.h头文件,在JDK中找到jni.h,并添加jni.h所在目录到当前工作路径:右键项目,属性-通用属性-C/C++-常规项在右边的附加包含目录中把%JAVA_HOME%/include和%JAVA_HOME%/include/win32加进来。

4. 右键项目的资源文件加入资源-版本信息。编译项目,在项目的Release下面找到TestNativeDemoCpp.dll文件,也有可能在项目的上层目录的release下边,跟设置有关。

?

第三步:运行Java调用DLL程序

把第二步产生的TestNativeDemoCpp.dll文件拷贝到第一步产生TestNativeDemo.class的同一目录。

执行命令:java TestNativeDemo

输出:Hello,JniTestNativeDemo.testJni=Hello,Jni

?

-----------------------结束--------------------------

发表评论
用户名: 匿名