前段时间因为需要,公司需要写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
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