您的位置:首页 > 移动开发 > Android开发

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

2016-07-28 18:51 477 查看
编译的目标平台为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

目标达成!!!

欢迎回帖交流~~~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息