探索Java:JNI小试

1. Java代码

package com.github.manxisuo;

public class TestJNI
{
    static
    {
        System.loadLibrary("Hello");
    }

    public static native int get();
    public static native void set(int i);

    public static void main(String[] args)
    {
        set(10);
        int r = get();
        System.out.println("The result is " + r);
    }
}

2. 生成头文件

javah -jni com.github.manxisuo.TestJNI

将会生成com_github_manxisuo_TestJNI.h文件。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_github_manxisuo_TestJNI */

#ifndef _Included_com_github_manxisuo_TestJNI
#define _Included_com_github_manxisuo_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_github_manxisuo_TestJNI
 * Method:    get
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_github_manxisuo_TestJNI_get
  (JNIEnv *, jclass);

/*
 * Class:     com_github_manxisuo_TestJNI
 * Method:    set
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_com_github_manxisuo_TestJNI_set
  (JNIEnv *, jclass, jint);

#ifdef __cplusplus
}
#endif
#endif

3. C/C++代码

TestJNI.cpp文件:

#include <jni.h>
#include "com_github_manxisuo_TestJNI.h"

int i = 0;

JNIEXPORT jint JNICALL Java_com_github_manxisuo_TestJNI_get (JNIEnv *, jclass)
{
    return i;
}

JNIEXPORT void JNICALL Java_com_github_manxisuo_TestJNI_set (JNIEnv *, jclass, jint j)
{
    i = j;
}

4. 编译成动态链接库

gcc -fPIC -shared -I/usr/local/jdk1.7.0_01/include -I/usr/local/jdk1.7.0_01/include/linux libHello.cpp -o libHello.so

注意:在linux下,在查找库文件时,会在库名称前加上lib前缀。因此,库名称为Hello时,库文件的名称应该是libHello

5. 运行Java代码

结果如下:

The result is 10

参考:Java programming with JNI

使用 Hugo 构建
主题 StackJimmy 设计