Java+JNI调用动态库(Linux、Windows)的实现步骤


//======================================================================================//
// //
// JNI调用动态库(/)的实现步骤 //
// //
//======================================================================================//

1.编写实现类,如:

package com.jni;

public class demo{
static{
System.loadLibrary(“JniDemo”); //libJniDemo.so/JniDemo.dll
}

public demo(){
}

public native static void Hello();

public native static void Hello2(String strMsg);

public native static String Hello3(String strMsg);

/**
测试代码
*/
public static void main(String[] args) {

com.jni.demo.Hello();
com.jni.demo.Hello2(“Hello2”);
String str = com.jni.demo.Hello3(“Hello3”);
System.out.println(str);
return;
}
}

2.编写C/C++头文件,如:

文件名:com_jni_demo.h
文件内容:

#include

#ifndef _Included_com_jni_demo
#define _Included_com_jni_demo

#ifdef __cplusplus
extern “C” {
#endif
/*
*Class: com.jni.demo
*Method: Hollo
*Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_jni_demo_Hollo(JNIEnv *, jobject);
//—————————————————————————
/*
*Class: com.jni.demo
*Method: Hollo2
*Signature: (JLang/jstring)V
*/
JNIEXPORT void JNICALL Java_com_jni_demo_Hollo2(JNIEnv *, jobject, jstring);
//—————————————————————————
/*
*Class: com.jni.demo
*Method: Hollo3
*Signature: JLang/jstring(JLang/jstring)
*/
JNIEXPORT jstring JNICALL Java_com_jni_demo_Hollo3(JNIEnv *, jobject, jstring);
//—————————————————————————
#ifdef __cplusplus
}
#endif
#endif

/*
函数名Java_com_jni_demo_Hello说明:
Java_com_jni_demo_ 对应代码的类:com.jni.demo
Hello 对应代码中的函数名称:Hollo

*/

3.编写C++实现代码

文件名:demo.cpp
文件内容:

#include
#include
#include
#include
#include “com_jni_demo.h”

/*
*Class: com.jni.demo
*Method: Hollo
*Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_jni_demo_Hollo(JNIEnv *evn, jobject obj)
{
printf(“Java_com_jni_demo_Hollo has been called!
“);
return;
}

/*
*Class: com.jni.demo
*Method: Hollo2
*Signature: (JLang/jstring)V
*/
JNIEXPORT void JNICALL Java_com_jni_demo_Hollo2(JNIEnv *evn, jobject obj, jstring strMsg)
{
char szMsg[1024]={“”};
sprintf( szMsg, “%s”, env->GetStringUTFChars(strMsg, 0) );
printf(“Java_com_jni_demo_Hollo2 has been called! msg:%s
“,szMsg);
return;
}

/*
*Class: com.jni.demo
*Method: Hollo3
*Signature: JLang/jstring(JLang/jstring)
*/
JNIEXPORT jstring JNICALL Java_com_jni_demo_Hollo3(JNIEnv *evn, jobject obj, jstring strMsg)
{
char szMsg[1024]={“”};
sprintf( szMsg, “Java_com_jni_demo_Hollo3 has been called! msg:%s
“, env->GetStringUTFChars(strMsg, 0) );
return env->NewStringUTF(szMsg);
}

4.使用C++编译器(我用的是g++编译器)编译C++程序,生成动态链接库

4.1 下的编译命令行如下:

g++ -I”%JAVA_HOME%include” -I”%JAVA_HOME%includewin32″ -Wl,–add-stdcall-alias -shared -o .JniDemo.dll .demo.cpp

编译生成,将动态链接库复制到 的System32系统目录下。

4.2 Linux下的编译命令行如下:

g++ -shared -o /usr/lib/libJniDemo.so ./demo.cpp

说明:在Linux下,动态链接库名必须以lib开头命名。

5.测试

执行文件demo.,屏幕上打印出:
Java_com_jni_demo_Hollo has been called!
Java_com_jni_demo_Hollo2 has been called! msg:Hollo2
Java_com_jni_demo_Hollo3 has been called! msg:Hollo3
表示java调用动态链接库成功。

此程序在Ubuntu8.10和 2003下测试通过。

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《Java+JNI调用动态库(Linux、Windows)的实现步骤
本文地址:https://www.zhiletu.com/archives-334.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!