JNI技术实现--Java调C/C++

废话不多说,首先我们来看Java调用C/C++步骤:

    1.编写Java代码,在代码中使用native关键字标明该方法是调用本地库,不需要实现。

    2.使用javah -jni 命令,生成对应的头文件,此步骤主要是规范化本地代码,总所周知,Java是平台无关的,但是C/C++是平台相关的,所以需要规范本地代码,使其表示的值与Java中的值意义相同。

    3.用C/C++实现头文件中的接口函数,并把其编译链接成动态链接库,在环境变量设置动态库路径。

    4.在Java代码中添加加载动态链接库的代码,并将其编译为class文件。

    5.运行并测试效果。

example:

1、java代码:Hello.java

 1 public class Hello {
 2 
 3     static {
 4         System.loadLibrary("hello");
 5     }
 6 
 7     public native static void hello(String s); //声明本地库函数
 8 
 9     public static void main(String[] args) {
10         hello("hello");
11         for(String s : args) hello(s);
12     }
13 }

2、使用 javah -jni Hello 命令生成  Hello.h

 1 /* DO NOT EDIT THIS FILE - it is machine generated */
 2 #include <jni.h>
 3 /* Header for class Hello */
 4 
 5 #ifndef _Included_Hello
 6 #define _Included_Hello
 7 #ifdef __cplusplus
 8 extern "C" {
 9 #endif
10 /*
11  * Class:     Hello
12  * Method:    hello
13  * Signature: (Ljava/lang/String;)V
14  */
15 JNIEXPORT void JNICALL Java_Hello_hello
16   (JNIEnv *, jclass, jstring);
17 
18 #ifdef __cplusplus
19 }
20 #endif
21 #endif

3、实现头文件 Hello.h 中的函数  JNIEXPORT void JNICALL Java_Hello_hello(JNIEnv *, jclass, jstring);

新建cpp文件 Hello.cpp  内容如下:

 1 #include <jni.h>
 2 #include"Hello.h"
 3 #include<iostream>
 4 using namespace std;
 5 JNIEXPORT void JNICALL Java_Hello_hello (JNIEnv* env, jclass jc, jstring s)
 6 {
 7     const char* str = env->GetStringUTFChars(s, 0);
 8     cout << str << endl;
 9     env->ReleaseStringUTFChars(s, str);
10 }

将 Hello.cpp 编译成动态库 libhello.so:g++ -fPIC -shared -IXXX_jni -IXXX_jni_md Hello.cpp -o libhello.so  其中 XXX_jni 为jni.h的路径, XXX_jni_md 为 jni_md.h 的路径

4、编译 Hello.java : javac Hello.java   生成 Hello.class   最好还要添加 libhello.so 路径到环境变量才能运行。

5、运行结果:

猜你喜欢

转载自www.cnblogs.com/my-cnblogs-com/p/8947501.html
今日推荐