JNI 调用C/C++

来源:互联网 发布:linux ctrl alt del 编辑:程序博客网 时间:2024/05/17 13:12

JNI调用可以加快JAVA的运行速度,主要是将关键的代码用C/C++ 或者mfc完成,在这里贴上我写的一段代码,有兴趣的可以参考:

头文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class cn_com_wintone_TLConnectJNI */

#ifndef _Included_cn_com_wintone_TLConnectJNI
#define _Included_cn_com_wintone_TLConnectJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     cn_com_wintone_TLConnectJNI
 * Method:    Prt
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_cn_com_wintone_TLConnectJNI_Prt
  (JNIEnv *, jobject);
JNIEXPORT jboolean JNICALL Java_cn_com_wintone_TLConnectJNI_initOCRTL
  (JNIEnv *envPram, jobject);
/*
 * Class:     cn_com_wintone_TLConnectJNI
 * Method:    uninitOCRTL
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_cn_com_wintone_TLConnectJNI_uninitOCRTL
  (JNIEnv *envPram, jobject);

/*
 * Class:     cn_com_wintone_TLConnectJNI
 * Method:    setChineseTL
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_cn_com_wintone_TLConnectJNI_setChineseTL
  (JNIEnv *, jobject);

/*
 * Class:     cn_com_wintone_TLConnectJNI
 * Method:    setEnglishTL
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_cn_com_wintone_TLConnectJNI_setEnglishTL
  (JNIEnv *, jobject);

/*
 * Class:     cn_com_wintone_TLConnectJNI
 * Method:    setNumberTL
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_cn_com_wintone_TLConnectJNI_setNumberTL
  (JNIEnv *, jobject);

/*
 * Class:     cn_com_wintone_TLConnectJNI
 * Method:    setSymbolTL
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_cn_com_wintone_TLConnectJNI_setSymbolTL
  (JNIEnv *, jobject);

/*
 * Class:     cn_com_wintone_TLConnectJNI
 * Method:    setAllTL
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_cn_com_wintone_TLConnectJNI_setAllTL
  (JNIEnv *, jobject);

/*
 * Class:     cn_com_wintone_TLConnectJNI
 * Method:    setRangeEnglishSmallTL
 * Signature: ()Z
 */
JNIEXPORT jstring JNICALL Java_cn_com_wintone_TLConnectJNI_RecognizeTL
  (JNIEnv *envPram, jobject, jintArray ary, jint size);

JNIEXPORT void JNICALL Java_cn_com_wintone_TLConnectJNI_SetRange
  (JNIEnv *envPram, jobject, jint range);

 

#ifdef __cplusplus
}
#endif
#endif
源文件:

#include "cn_com_wintone_TLConnectJNI.h"
#include <stdio.h>
#include <stdlib.h>
#include "string.h"
#include "TLPENSC.h"
//#include "TLPEN_3RD.h"
#include "TLpen_V4.h"
#define LOGSTRINGSIZE 255
#define LIBFILE "/data/TLPENPDA.lib"
#define SIZE_RamAddress (1024*4)
char *g_RamAddress =0;//
char *g_LibStartAddress = 0;
char _TAG[]= "123321";
char *TAG = (char*)_TAG;
void getLibAdress(JNIEnv * envParam);//获取Lib地址
void printLog(JNIEnv * envParam, const char *ch0, const char *ch1)
{
 jclass clsLog = envParam->FindClass("android/util/Log");
 jmethodID midLoge = envParam->GetStaticMethodID(clsLog, "d", "(Ljava/lang/String;Ljava/lang/String;)I");
 jstring str0 = envParam->NewStringUTF( ch0);
 jstring str1 = envParam->NewStringUTF(ch1);
 envParam->CallStaticIntMethod( clsLog, midLoge, str0, str1 );
}
JNIEXPORT void JNICALL Java_cn_com_wintone_TLConnectJNI_Prt
 (JNIEnv *envParam, jobject)
  {
     printLog(envParam,"connectJNI","connectJNI");
  }

void getLibAdress(JNIEnv * envParam)
{
 /*FILE * TLPENLibFile;
 long TotalFileLength;
 printLog(envParam, TAG, "---begin---getLibAdress");
 if((TLPENLibFile=fopen(LIBFILE,"rb"))==NULL)
 {
  printLog(envParam, TAG, "---funk!---getLibAdress");
  return ;
 }
 fseek(TLPENLibFile,0,SEEK_END);
 TotalFileLength=ftell(TLPENLibFile);
 fseek(TLPENLibFile,0,SEEK_SET);
 g_LibStartAddress=(char *)malloc(TotalFileLength);
 fread(g_LibStartAddress,sizeof(char),TotalFileLength,TLPENLibFile);
 fclose(TLPENLibFile);
 printLog(envParam, TAG, "---end---getLibAdress");
 return ;*/
 g_LibStartAddress = LibStartAddress ;
}
JNIEXPORT jboolean JNICALL Java_cn_com_wintone_TLConnectJNI_initOCRTL
  (JNIEnv *envParam, jobject)
  {
 char ch0[LOGSTRINGSIZE] = "123321";
 char ch1[LOGSTRINGSIZE] = "-----initOCRTL-----";
 TLError errorRet = 0;
 //printLog(envParam, ch0, ch1);
 getLibAdress(envParam);
//printLog(envParam, ch0, ch1);
 g_RamAddress = new char[SIZE_RamAddress];
 memset(g_RamAddress, 0, SIZE_RamAddress);
//printLog(envParam, ch0, ch1);
 errorRet = TLRecognizeInit(
  g_RamAddress,
  SIZE_RamAddress,
  g_LibStartAddress);
//printLog(envParam, ch0, ch1);
 if(errorRet != 0)
 {
  printLog(envParam, TAG, "Funk!----TLRecognizeInit");
  return 0;
 }
//printLog(envParam, ch0, ch1);
 //printLog(envParam, TAG, "OK!--------TLRecognizeInit");
 if(0 != (*TLSetRange)(0x0400,g_RamAddress))
  printLog(envParam, TAG, "fuck!--------TLSetRange");
 return 1;
  }
JNIEXPORT jboolean JNICALL Java_cn_com_wintone_TLConnectJNI_uninitOCRTL
  (JNIEnv *envParam, jobject)
  {
 char ch0[LOGSTRINGSIZE] = "123321";
 char ch1[LOGSTRINGSIZE] = "-----uninitOCRTL--------";
 //printLog(envParam, ch0, ch1);
 if(0 != (*TLRecognizeEnd)(g_RamAddress))
 {
  printLog(envParam, TAG, "Funk!----TLRecognizeEnd");
  //return 0;
 }
 delete g_RamAddress;
 return 1;
  }
JNIEXPORT void JNICALL Java_cn_com_wintone_TLConnectJNI_SetRange
 (JNIEnv * envParam, jobject, jint range)
  {
//     printLog(envParam, TAG, "--Java_cn_TL_size_twe_TLConnectJNI_SetRange");
     if(0 != TLSetRange(range,g_RamAddress))
    printLog(envParam, "", "Java_cn_com_wintone_TLConnectJNI_SetRange error");
  }
JNIEXPORT jstring JNICALL Java_cn_com_wintone_TLConnectJNI_RecognizeTL
 (JNIEnv *envParam, jobject, jintArray ary, jint size)
  {
 //  printLog(envParam, TAG, "OK!----TLConnectJNI_RecognizeTL");
//   printLog(envParam, TAG, "OK!----TLConnectJNI_RecognizeTL");
   int* pCh = 0;unsigned short CandidateResult[30] = {0};
 unsigned char character[1024*5 ]={0};
 pCh = (envParam->GetIntArrayElements(ary, false));
 for(int i=0; i<size; i++)
 {
  character[i] = (unsigned char)(pCh[i]);
 }
 if(0 != (*TLRecognize)(character, 1024*5, CandidateResult, g_RamAddress))
 {
  printLog(envParam, TAG, "NO!----TLConnectJNI_RecognizeTL");
 }

 
 jstring strRet = envParam->NewString((jchar *)CandidateResult,30);
// printLog(envParam, TAG, "OK!----TLConnectJNI_RecognizeTL");
 return strRet;
  }
java代码:

package cn.com.wintone;

import android.util.Log;

public class TLConnectJNI {
 private final static String m_tag = "TLConnectJNI";
 static
 {
  //Log.d(m_tag, "begin load libTLCJNI.so");
  System.load("/data/data/cn.com.wintone/lib/libTLJNI.so");
 // System.loadLibrary("TLCJNI.so");
  //System.loadLibrary("TLCJNI");
  //Log.d(m_tag, "load libTLCJNI.so OK!");
 }

 
 public native boolean initOCRTL();
 public native boolean uninitOCRTL();

 public native boolean setChineseTL();
 public native boolean setEnglishTL();
 public native boolean setNumberTL();
 public native boolean setSymbolTL();
 public native boolean setAllTL();
 public native boolean setRangeEnglishSmallTL();
 public native boolean setRangeEnglishBigTL();
 public native boolean setSpeedTL();
 public native void RecognizeUShortTL();
 public native String RecognizeTL(int []ch, int index);
 public native void SetRange(int range);
 ////////////////////////////////////////////////
 
 private TLConnectJNI()
 {
 }
 private static  TLConnectJNI m_JNIInstance = null;
 public static  TLConnectJNI Instance()
 {
  if(m_JNIInstance == null)
  {
   m_JNIInstance = new TLConnectJNI();
  }
  return m_JNIInstance;
 }
 
 
}
仅供参考,转载请注明出处!

原创粉丝点击