jni编译过程中的问题

来源:互联网 发布:java 反射 参数 null 编辑:程序博客网 时间:2024/06/03 17:29

通过JNI实现Java和C++的相互调用

一、从Java调用C++的DLL

1.    创建Java文件

创建名为TestNative的Java文件,注意包名。

package org.druze.test;

publicclass TestNative {

    publicnativevoid sayHello();

    publicvoid sayHello2(){

       System.out.println("Say Hello From Java");

    }

}

如代码所示,对于sayHello方法声明为native,这一部分将由C++的动态库来实现。

2.    生成class文件

使用javac org/druze/test/TestNative.java生成class文件

注意:执行该命令在org所在目录执行。

3.    使用javah命令生成相应的C++头文件

使用javah org.druze.test.TestNative生成名为

org_druze_test_TestNative.h的头文件

注意:执行该命令在bin所在目录执行。

该头文件的内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class org_druze_test_TestNative */

#ifndef _Included_org_druze_test_TestNative

#define _Included_org_druze_test_TestNative

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     org_druze_test_TestNative

 * Method:    sayHello

 * Signature: ()V

 */

JNIEXPORT void JNICALL Java_org_druze_test_TestNative_sayHello

 (JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

4.    创建C++解决方案

此处以VS2008为例。

新建一个VC++Win32项目,选择如图所示的控制台应用程序。项目名称为NativeCode

点击确定后,再点击下一步,出现该页面,应用程序类型选择DLL

5.    创建号工程之后,将org_druze_test_TestNative.h导入到工程里面,并创建名为source.cpp的源代码,内容如下:(vs导入头文件时要加入文件所在目录project->propertys->VC++directories->include directories)

#include"org_druze_test_TestNative.h"  

#include<iostream>  

using namespace std;  

JNIEXPORT void JNICALL Java_org_druze_test_TestNative_sayHello(JNIEnv *env, jobject obj)

{  

    cout<<"Hello World!"<<endl;  

(编译过程中可能会出现 error C1902 Programdatabase manager mismatch; please check your installation ,解决方式:讲\VS\Common7\IDE下的mspdb100.dll及mspdbsrv.exe复制到\VS\VC\bin下即可)

6.    在工具->选项->项目和解决方案->VC++目录菜单中,平台选择Win32,选择“显示以下内容的目录”为“包含文件”,导入jni.hjni_md.h的路径。

7.    编译,生成NativeCode.dll,并将其copy到环境变量PATH的路径下。

8.    修改TestNative.java

package org.druze.test;

publicclass TestNative {

    publicnativevoid sayHello();

    publicstaticvoid main(String[] args) {

        // 加载动态连接库DLL,如果没有找到的话,则会在运行时报错  

        System.loadLibrary("NativeCode");  

          

        TestNative tnt = new TestNative();  

              

        tnt.sayHello();  

    }

    publicvoid sayHello2(){

       System.out.println("Say Hello From Java");

    }

}

运行,显示“Hello World! 

9.    注意头文件jni.hjni_md.h可以直接导入到工程中也可以。

10.注意NativeCode.dll必须放置在java命令能访问的路径中。


运行出现Exception in thread "main" java.lang.UnsatisfiedLinkError: E:\Program Files\JAVA and Android\JDK\jre\bin\Native.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

解决办法使用jre_x64运行,把dll文件放到工程下面:
下载地址
http://www.oracle.com/technetwork/java/javase/downloads/jre-6u26-download-400751.html

配置:




创建工程时选择jre_x64
运行时:


0 0
原创粉丝点击