【jni】linux 下生成 jni 并进行测试

Ilona ·
更新时间:2024-09-20
· 661 次阅读

文件目录

创建好目录  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



行测 Linux jni 测试

需要 登录 后方可回复, 如果你还没有账号请 注册新账号