手把手教你JNI接口编写流程

编译的目标平台为X86架构,本地终端可以直接调用执行。整个构建的流程是从上到下(Java->C)构建。

第一步,编写自己的MyJni.java类,如下:

public class MyJni {
    public native void display();

    public native double sum(double x, double y);

    public static void main(String[] args) {
        MyJni myjni = new MyJni();
		System.out.print(myjni.sum(1,1));
		System.out.print("\n");
		myjni.display();
    }

    static {
        System.load("/home/kongbo/test/java/libkb_jni.so");
    }

}

第二步,需要生成响应的JNI头文件,执行:  javah MyJni,会在当前目录下生成MyJni.h,

内容如下:

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

#ifndef _Included_MyJni
#define _Included_MyJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     MyJni
 * Method:    display
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_MyJni_display
  (JNIEnv *, jobject);

/*
 * Class:     MyJni
 * Method:    sum
 * Signature: (DD)D
 */
JNIEXPORT jdouble JNICALL Java_MyJni_sum
  (JNIEnv *, jobject, jdouble, jdouble);

#ifdef __cplusplus
}
#endif
#endif


第三步,实现上一步中自动生成的头文件中的函数实体文件。kongbo_jni.c

#include <jni.h>
#include <stdio.h>
#include "MyJni.h"

JNIEXPORT void JNICALL Java_MyJni_display
   (JNIEnv *env, jobject obj) {
    printf("Here comes kongbo's JNI interface\n");
}
 
 /*
  * Class:     MyJni
  * Method:    sum
  * Signature: (DD)D
  */
JNIEXPORT jdouble JNICALL Java_MyJni_sum
   (JNIEnv *env, jobject obj, jdouble a, jdouble b) {
    return a + b;
}


第四步,代码工作基本完成,需要出.class文件以及相应的so库了。

对于.class文件,终端执行:javac MyJni 即可在当前目录生成。

对于so库,敝人写了一个高端的Makefile,内容如下:

JNI_PATH:=/opt/java/jdk1.6.0_45/include
JNI_LINUX:=/opt/java/jdk1.6.0_45/include/linux
CFLAG:= -fPIC -D_REENTRANT -I $(JNI_PATH) -I $(JNI_LINUX)
libkb_jni.so: kongbo_jni.o
	cc -shared kongbo_jni.o -o libkb_jni.so
kongbo_jni.o: kongbo_jni.c MyJni.h
	cc $(CFLAG) -c kongbo_jni.c

.PHONY: clean
clean:
	rm libkb_jni.so kongbo_jni.o

然后执行make,即可生成.so文件喽。。。


第五步,运行结果:

终端执行 java MyJni

2.0
Here comes kongbo's JNI interface

目标达成!!!




欢迎回帖交流~~~~~~












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值