JNI--java调用C&C++

 直接上步骤:

编写java代码

package cn.ace.jni;

 

public class TestNative {

 

    public native void sayHello();

   

    public static void main(String[] args) {

      

    }

}

 

 

使用javah.exe工具生成头文件 cn_ace_jni_TestNative.h

生成方法:

执行如下命令:TestNative为class的文件名

 技术分享

生成文件内容:

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

#include <jni.h>

/* Header for class cn_ace_jni_TestNative */

 

#ifndef _Included_cn_ace_jni_TestNative

#define _Included_cn_ace_jni_TestNative

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     cn_ace_jni_TestNative

 * Method:    sayHello

 * Signature: ()V

 */

JNIEXPORT void JNICALL Java_cn_ace_jni_TestNative_sayHello

  (JNIEnv *, jobject);

 

#ifdef __cplusplus

}

#endif

#endif

 

编写C++代码,生成动态库 

创建工程:MFC

技术分享 

将cn_ace_jni_TestNative.h添加到工程中,同时将编译时所以来的jdk相关文件拷贝到VC工程目录下(jni_md.h、jni.h)此文件为D:\j2ee_lib\jdk1.6.0_10\include\目录下 

创建C++ 文件,source.cpp 内容:

#include"cn_ace_jni_TestNative.h"

#include<iostream>

using namespace std;

 

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

{

         cout<<"Hello world!"<<endl;

}

 

编译工程生成testNative.dll

 

将testNative.dll设置为系统环境变量(path):D:\TestC++\testNative\Debug;

 

编写java代码调用动态库:

package cn.ace.jni;

 

public class TestNative {

 

    public native void sayHello();

   

    public static void main(String[] args) {

       System.loadLibrary("testNative");

       TestNative testNative = new TestNative();

       testNative.sayHello();

    }

}

 

 

完成后运行: 出现错误如下:

原因:刚设置的环境变量没有生效,导致找不到动态库的路径

解决办法:重启动eclipse,因为eclipse在初次启动时,会加载环境变量。

Exception in thread "main" java.lang.UnsatisfiedLinkError: no testNative in java.library.path

    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1709)

    at java.lang.Runtime.loadLibrary0(Runtime.java:823)

    at java.lang.System.loadLibrary(System.java:1030)

    at cn.ace.jni.TestNative.main(TestNative.java:8)

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。