1、编写native接口

package org.demo;

public class JniDemo
{
public static native int bmp2fea(byte[] bmp, byte[] fea, byte[] err); public static native int feaMatch(byte[] fea1, byte[] fea2, String flag, int level); }

2、根据native接口生成声明文件(.h)

javah -classpath . -jni org.demo.JniDemo

3、编写接口代码调动so动态库(.c)#include <stdlib.h>

#include <stadio.h>
#include <string.h>
#include 'org_demo_JniDemo.h' extern int feaMatch(char *pRegAscii, char *pVerAscii, int level);
extern int bmp2fea(unsigned char* bmp, char* feature, char* flag, char* errinfo); JNIEXPORT jint JNICALL JAVA_org_demo_JniDemo_bmp2fea (JNIEnv *env, jclass arg, jbyteArray bmp, jbyteArray fea, jbyteArray err)
{
char out[] = { };
char errinfo[] = { };
jbyte* pbmp = (*env)->GetByteArrayElements(env, bmp, );
jsize inSize = (*env)->GetArrayLength(env, bmp);
//bmp大小平均150k,使用malloc
//char *tmp = (char*)malloc(inSize + );
//memset(tmp, , inSize+);
  char *tmp = (char*)calloc(inSize+1, sizeOf(char));
  if (tmp == NULL)
  {
    (*env)->ThrowNew(env,
      (*env)->FindClass(env, "java/lang/OutOfMemoryError"), "jni calloc failed");
    return;
  }
memcpy(tmp, pbmp, inSize); int ret = bmp2fea((unsigned char*)tmp, (char*)out, (char*)errinfo);
if (ret == )
{
(*env)->SetByteArrayRegion(env, fea, , strlen(out), (jbyte*)out);
if (strlen(errinfo) > )
(*env)->SetByteArrayRegion(env, err, , strlen(errinfo), (jbyte*)out);
}
else
{
if (strlen(errinfo) > )
(*env)->SetByteArrayRegion(env, err, , strlen(errinfo), (jbyte*)out);
}
if (tmp != NULL)
{
free(tmp);
}
(*env)->ReleaseByteArrayElements(env, bmp, pbmp, JNI_ABORT);
return rt;
} JNIEXPORT jint JNICALL Java_org_demo_JniDemo_feaMatch (JNIEnv *env, jclass arg, jbyteArray fea1, jbyteArray fea2, jstring flag, jint level)
{
char tmp1[] = { };
char tmp2[] = { }; jbyte* pFea1 = (*env)->GetByteArrayElements(env, fea1, );
jsize inSize1 = (*env)->GetArrayLength(env, fea1);
memcpy(tmp1, pFea1, inSize1);
jbyte* pFea2 = (*env)->GetByteArrayElements(env, fea2, );
jsize inSize2 = (*env)->GetArrayLength(env, fea2);
memcpy(tmp2, pFea2, inSize2);
char* pflag = (char*)(*env)->GetStringUTFChars(env, flag, 0); 
int ret = feaMatch(tmp1, tmp2, pflag, level);
(*env)->ReleaseByteArrayElements(env, fea1, pFea1, JNI_ABORT);
(*env)->ReleaseByteArrayElements(env, fea1, pFea2, JNI_ABORT);
(*env)->ReleaseStringUTFChars(env, flag, pflag);
return ret;
}

4、根据.h、.c编译生成so,如下makefie文件make生成libengine.so

ODIR=.
EDIR=.
LDIR=.
INC_DIR=./ CC=g++
AR=ar -r
LD=ld
RM=rm -rf
cc=gcc
STRIP=strip
MKDIR=mkdir -p INCLUDES=-I$(INC_DIR)
CCFLAGS=-g $(INCLUDES) -fPIC
LIBS=-lc -ldl -ldemo SRC_DIR=./
ALL_DIR=-I$(SRC_DIR) -I/usr/java/jdk1..0_80/include/ -I/usr/java/jdk1..0_80/include/linux/ LIBAPI_SO=$(LDIR)/libengine.so
BIZD=$(EDIR)/test PROGRAM=$(LIBAPI_SO) ####object files####
LIBAPI_OBJ=$(ODIR)/org_demo_JniDemo.o
####object files####
BIZ_OBJ=$(ODIR)/test.o
##############
all:$(PROGRAM)
force:
$(LIBAPI_SO)::$(LIBAPI_OBJ)
@echo ----Linking...----
$(LD) -share -o $(LIBAPI_SO) $(LIBAPI_OBJ) -L./ $(LIBS)
@echo ----make $@ OK----
$(BIZD)::$(BIZ_OBJ)
@echo ----Linking...----
$(cc) -o $(BIZD) $(BIZD_OBJ) -L$(LDIR) $(LIBS) $(CCFLAGS)
@echo ----make $@ OK----
clean::
@$(RM) $(ODIR)/*.o $(PROGRAM)
cleanobj::
@$(RM) $(BIZ_OBJ)
cleanbin::
@$(RM) $(PROGRAM) .SUFFIXES:.cpp .c .o .so .a
####common#####
$(ODIR)/%.o:$(SRC_DIR)/%.c
$(cc) $(CCFLAGS) $< $(ALL_DIR) -c -o $@

5、java调用native接口

package org.demo;

import org.demo.JniDemo;

public class Demo
{
static {
// 动态库名: libdemo.so
System.loadLibrary("demo");
// libengine.so
System.loadLibrary("engine");
} public static int bmp2fea(byte[] bmp, byte[] fea, byte[] err)
{
return JniDemo.bmp2fea(bmp, fea, err);
} public static int feaMatch(byte[] fea1, byte[] fea2,String flag, int level)
{
return JniDemo.feaMatch(fea1, fea2, flag, level);
}
}

6、配置动态库路径

方法一:
#linux用户环境变量配置:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/demo/lib/ 方法二:
#程序启动是配置JVM参数:
java -Djava.library.path=/demo/lib/ -server -cp $CLASSPATH org.demo.Test

最新文章

  1. svg可缩放矢量图形
  2. *[hackerrank]Consecutive Subsequences
  3. hdu_1003_Max Sum
  4. Hibernate二 映射 注解 一级缓存
  5. HDU 4284 状压dp+spfa
  6. 软硬链接、文件删除原理、linux中的三种时间、chkconfig优化
  7. .net中LAMBDA表达式常用写法
  8. ERP中文档权限设置:只能浏览不能下载?如何实现
  9. 关于Kafka监控方案的讨论
  10. mpvue-docs基于vue来开发微信小程序
  11. python之pymongo
  12. 锚点的animate使用过程中定位不准确的问题小记
  13. web页面乱码,JSP页面编码设置
  14. Hadoop安装教程_集群/分布式配置
  15. 解读EXPLAIN执行计划中的key_len(转)
  16. Cloud Foundry v2 部署及入门运维
  17. PHP回调函数及匿名函数概念与用法详解
  18. ifconfig-dropped
  19. WinForm界面开发之 启动界面
  20. HOJ Recoup Traveling Expenses(最长递减子序列变形)

热门文章

  1. App在iTunes Store上的地址
  2. 「CSP-S」2019年第一届Day1游记+题解
  3. 当你输入一个url链接发生了什么?
  4. ADV-298 和谐宿舍2 动态规划
  5. 常用的HBase命令
  6. Lognormal distribution 对数正态分布
  7. LeetCode 297.序列化二叉树 - JavaScript
  8. CH12 动态内存
  9. ROS-3 : Catkin工作空间和ROS功能包
  10. JuJu团队12月28号工作汇报