javacode:TestNative.java
package com.cloud;
public class TestNative {
public static void main(String[] args) {
System.loadLibrary("NativeTestCodeDLL");
new TestNative().sayHello();
}
/**
* 编写java程序,方法必须用native修饰,并且方法不可以有实现体。
* 调用【native>本地的】c/c++程序
*/
public native void sayHello();
}
生成c++头文件为:com_cloud_TestNative.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_cloud_TestNative */
#ifndef _Included_com_cloud_TestNative
#define _Included_com_cloud_TestNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_cloud_TestNative
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_cloud_TestNative_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
编写Java程序通过jni调用c、c++程序
1 编写java程序,编写一个 声明调用c++的实现方法,方法必须用native修饰,并且方法不可以有实现体。
2 用jdk自带的javah命令,运行cmd命令行切换到class文件的目录下,或者指定classpath
3 在cmd命令行输入【javah java文件全类名】生成class文件所对应的c++头文件【.h文件】 。class目录下生成了.h的文件代表生成头文件成功。
4 用c++的ide VS2010 创建c++项目》Win32》Win32控制台应用程序》,输入项目名称,下一步》选择DLL>选择 空的工程。然后生成项目。
5 把刚才javah命令生成的头文件【.h】文件复制到c++工程下面,然后在VS里选中:头文件》鼠标右键》添加》现有项,选择复制过来的头文件【.h】。
6 选中:源文件》添加》新建项》c++文件(.cpp)。输入文件名,创建文件。
7 打开复制进来的头文件,复制方法到创建的.cpp文件里。
8 编写c++代码
示例如下:
#include"com_cloud_TestNative.h"
#include<iostream>
using namespace std;
JNIEXPORT void JNICALL Java_com_cloud_TestNative_sayHello(JNIEnv * env, jobject obj)
{
cout<<"Hello Word"<<endl;
}
9 编译。会发生错误。
第一个提示缺少jni.h文件,将jdk\include下面的jni.h文件拷贝到c++工程下,并且把<>括号修改为双引号,示例:#include "jni.h"
第二个提示缺少#include "jni_md.h",在jdk\include\win32里找到jni_md.h,复制到c++工程下。
编译通过。生成了c++项目的DLL文件。ok。
10 把dll动态链接库路径设置到环境变量Path中。
11 编写Java程序调用DLL动态连接库。java中用System.loadLibrary("TeatNative");DLL的文件名,不包含扩展名。加载TestNative.dll文件。
如果出错,需要eclipse重启,让eclipse启动的时候会重新加载环境变量
12 执行调用,输出HelloWorld,成功!!!。