1. 使用eclipse开发工程新建一个javaproject项目
2. 把SplitImage.java类文件直接复制进src目录下。
其中包名为com.touchspring.captcha
3. 生成.h头文件
使用命令行工具进入到src目录下执行javah com.touchsprig.captcha.SplitImage
会生成如com_touchspring_captcha_SplitImage.h文件。
4. 新建c++工程。并实现该头文件的函数即可,编译通过后,会生成的动态库(dll,so,jnilib等)。
在压缩包中的SplitImage.cpp是样例代码。
在不同平台会有不同的编译环境。在windows平台直接可以使用微软visual studio 开发工具,如果在编译的过程中找不到jni.h,jni_md.h请把jdk下的头文件,包含到include配置项中。
如果是linux或者mac os可以直接命令行使用gcc即可。
mac os 环境下的编译命令:
1) gcc -I/Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/include-I//Library/Java/JavaVirtualMachines/jdk1.8.0_20.jdk/Contents/Home/include/darwin/ -c SplitImage.cpp
2) gcc -dynamiclib -o libsplitImage.jnilib SplitImage.o
package com.touchspring.captcha;
public class SplitImage {
/**
* @param imagePath
* @param originalImageName
* @param telNumberType
* @return 返回分隔后的图片文件名称数组
*/
public native String[] splitImage(String imagePath,String originalImageName,int telNumberType);
static{
//注:编译好的动态库命名规则为libsplitImage.dll,libsplitImage.so,libsplitImage.jnilib。分别是windows,linux,mac os系统的方式。
System.loadLibrary("splitImage");
}
public static void main(String[] args) {
SplitImage splitImage = new SplitImage();
String results[] = splitImage.splitImage("", "", 1);
for (int i = 0; i < results.length; i++) {
System.out.println(results[i]);
}
System.out.println(results.length);
}
}
C++实现
#include "com_touchspring_captcha_SplitImage.h"
//com_touchspring_captcha_SplitImage
JNIEXPORT jobjectArray JNICALL Java_com_touchspring_captcha_SplitImage_splitImage
(JNIEnv *env, jobject obj, jstring imagePath, jstring originalImageName, jint telNumberType)
{
jobjectArray array;
jstring str;
char * resultArray[] = {"hello","world","jni","is","fun"};
int len = 5;
int i = 0;
array = (jobjectArray)(env->NewObjectArray(len,env->FindClass("java/lang/String"),0));
for(i = 0;i< len;i++){
str = (env)->NewStringUTF(resultArray[i]);
(env)->SetObjectArrayElement(array, i, str);
}
return array;
}