文件目录
创建好目录 c-complete, com/junxingpack/test 目录
第一步, 通过 JNIDemo.java 文件生成接口函数 , .h 文件
JNIDemo.java 文件如下
package com.junxingpack.test;
public class JNIDemo {
//定义一个方法,该方法在C中实现
public native void testHello();
public static void main(String[] args){
//加载C文件
System.loadLibrary("TestJNI");
JNIDemo jniDemo = new JNIDemo();
jniDemo.testHello();
}
}
JNIDemo.java 文件在 com/junxingpack/test 目录下, 在 mytest-java 目录下执行下面命令
javah -classpath . -jni com.junxingpack.test.JNIDemo
将生成 com_junxingpack_test_JNIDemo.h 文件
第二步, 将 jdk 安装目录下的 jni_md.h jni.h 拷贝到c-complete目录下,为生成 *.so 做准备。
以及 前面生成的 com_junxingpack_test_JNIDemo.h 文件
com_junxingpack_test_JNIDemo.h jni.h jni_md.h testjni.cpp
第三步: 在 c-complete 目录下,创建 tsetjni.cpp 文件,并实现方法。
#include "com_junxingpack_test_JNIDemo.h"
#include
#include
JNIEXPORT void JNICALL Java_com_junxingpack_test_JNIDemo_testHello
(JNIEnv *, jobject) {
printf("this is C++ print");
}
第四步:编写 makefile 文件, 生成 .so 。
这里有个目录,如果你的代码目录变了, 改下对应的源文件路径即可。
CC = g++
MAIN_PATH=./..
SRC_PATH=$(MAIN_PATH)/
VPATH =$(SRC_PATH)
SOURCE=$(wildcard $(SRC_PATH)/*.cpp)
SNOTDIR=$(notdir $(SOURCE))
OBJS=$(patsubst %.cpp, %.o, $(SNOTDIR) )
SNOTDIR_C=$(notdir $(SOURCE_C))
OBJS_C= $(patsubst %.c,%.o,$(SNOTDIR_C))
########################################
SYSLIB= -lpthread -lrt
CFLAGS= -O2 -c -fPIC -D_GNU_SOURCE -I/usr/local/include -I$(SRC_PATH) -I$(MAIN_PATH)
LDFLAGS=
#### java
TARGET=../bin/libTestHello.so
all: ${TARGET}
${TARGET}:${OBJS} $(OBJS_C)
${CC} -shared -ftemplate-depth-128 -fPIC ${SYSLIB} ${OBJS} ${OBJS_C} -o ${TARGET}
.cpp.o:
${CC} ${CFLAGS} $<
.c.o:
gcc ${CFLAGS} $<
clean:
rm -f ${TARGET}
rm -f *.o
第五步:编译 *.java 文件,并运行,查看结果
最外层 makefile 文件内容如下,方便运行测试。
.PHONY:compile run clean
compile:
javac com/junxingpack/test/JNIDemo.java
run:
java com.junxingpack.test.JNIDemo
clean:
@echo "start clean"
打印了 this is C++ print
Success!
作者:tango6432