前段時間因為需要,公司需要寫java和c++的程式,把這個分享給大家,當然網上還有更好的,其實jni就是java到C++的資料類型轉換
1.環境
export JAVA_HOME=/opt/java/jdk1.6.0_23
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export JRE_HOME=$JAVA_HOME/jre
2.:基本操作
1.java類中聲明本地方法,
2.然後調用javah命令產生.h標頭檔
3建立.cpp檔案實現.h裡面產生的方法
4編譯
5載入動態庫,調用本地方法
3.貼代碼,為了方便起見我講寫成了makefile檔案 但也有注釋
java類
public class JniDemo{
static {
System.loadLibrary("Demo");
}
public static native void print();
public static native int add(int a,int b);
public static void main(String[] args){
print();
System.out.println(add(4,5));
}
JniDemo.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JniDemo */
#ifndef _Included_JniDemo
#define _Included_JniDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JniDemo
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_JniDemo_print
(JNIEnv *, jclass);
/*
* Class: JniDemo
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_JniDemo_add
(JNIEnv *, jclass, jint, jint);
#ifdef __cplusplus
}
#endif
#endif
JniDemo.c
#include<stdio.h>
#include <jni.h>
#include "JniDemo.h"
JNIEXPORT void JNICALL Java_JniDemo_print
(JNIEnv *env, jobject obj){
printf("hello jni kkkkkkkkkkkkkkkkllllllllllllllllllll\n");
}
JNIEXPORT jint JNICALL Java_JniDemo_add
(JNIEnv *env, jobject obj, jint a, jint b){
return a+b;
}
}
makefile
LD:=ld
CPP:=gcc
CPPFLAGS:=-c
# the libfile name is libDemo.so
LIB:=libDemo.so
#the jni.h path
pathlix:=-I/opt/java/jdk1.6.0_23/include/
pathinclude:=-I/opt/java/jdk1.6.0_23/include/linux
objects:=JniDemo.o
edit:$(objects)
$(LD) -shared -o $(LIB) $(objects)
JniDemo.o:JniDemo.c JniDemo.h
$(CPP) $(pathlix) $(pathinclude) $(CPPFLAGS) JniDemo.c
clean:
rm -f $(objects