c++调用java 内存泄露的有关问题

c++调用java 内存泄露的问题
各位大侠,最近需要用c++调用java,然后自己看了看jni相关的东西,写了下,能运行,不过会内存泄露,我检查了下,new了的都delete了,java那边单独测试是不会内存泄露的,大家能不能帮我看看啊

网上看了好多东西,那个IBM有关jni的教程我也看了,说注意要DeleteLocalRef,我也是这样做了,但是就是内存涨的特别厉害,平均5秒就涨1M,我都无语了。各位能不能抽出宝贵的时间帮小弟看看啊,谢过了~~~还有两天就得交程序了~~
#include "cJava.h"
#include <sstream>

extern "C"
using namespace std;

namespace cJava {
ncIdentify::ncIdentify(JavaVM* myncjvm)
{
ncjvm = myncjvm;
JavaVMOption options[2];
  ncenv = NULL;
  JavaVMInitArgs vm_args;
  long status;
  options[0].optionString = "-Djava.compiler=NONE";
  options[1].optionString = "-Djava.class.path=.:../lib/NCnotDep.jar:../lib/CRFPP.jar";
  vm_args.version = JNI_VERSION_1_2; // JDK版本号
  vm_args.nOptions = 2;
  vm_args.options = options;
  status = JNI_CreateJavaVM(&ncjvm, (void**)&ncenv, &vm_args);
  if(status!=JNI_ERR)
  {
  cout<<"createJVM is OK"<<endl;
  }
  else
  {
  cout<<"creatJVM is fail"<<endl;
  }
  nccls = ncenv->FindClass("userinterface/NCidentify");
  cout<<"findClass is OK in c++"<<endl;
  if(nccls !=0){
  // 调用string
  jmethodID mid = ncenv->GetMethodID(nccls,"<init>","()V");
  ncjobj = ncenv->NewObject(nccls,mid);
  jmethodID midload = ncenv->GetMethodID(nccls,"loadResource","()V");
  ncenv->CallObjectMethod(ncjobj,midload);
}
}
ncIdentify::~ncIdentify()
{

ncenv->DeleteLocalRef(ncjobj);
ncenv->DeleteLocalRef(nccls);
ncjvm->DestroyJavaVM();

}
string ncIdentify::getNCresult(string query)
{
  string result;
  jclass strClass = ncenv->FindClass("java/lang/String");
jmethodID ctorID = ncenv->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");

/*char*转jstring*/
jbyteArray bytes = ncenv->NewByteArray(strlen(query.c_str()));
ncenv->SetByteArrayRegion(bytes, 0, strlen(query.c_str()), (jbyte*)query.c_str());
jstring encoding = ncenv->NewStringUTF("gbk");//utf-8
jstring queryJstr = (jstring)ncenv->NewObject(strClass, ctorID, bytes, encoding);
ncenv->DeleteLocalRef(bytes);
  jmethodID ncRegMid= ncenv->GetMethodID(nccls,"runNotDep","(Ljava/lang/String;)Ljava/lang/String;");//这里调用java里的一个函数
  jstring msg = (jstring)ncenv->CallObjectMethod(ncjobj,ncRegMid,queryJstr);
/*jstring转char* */
char* rtn = NULL;

  jmethodID mid = ncenv->GetMethodID(strClass, "getBytes", "(Ljava/lang/String;)[B");

jbyteArray barr =(jbyteArray)ncenv->CallObjectMethod(msg,mid,encoding);

jsize alen =(jsize)ncenv->GetArrayLength(barr);

jbyte* ba = ncenv->GetByteArrayElements(barr,JNI_FALSE);

if(alen > 0){
rtn = (char*)malloc(alen+1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
result = rtn;
free(rtn);
}
ncenv->ReleaseByteArrayElements(barr, ba, 0);
ncenv->DeleteLocalRef(encoding);
ncenv->DeleteLocalRef(strClass);

  ncenv->DeleteLocalRef(msg);
  ncenv->DeleteLocalRef(queryJstr);
  return result;
}
}

int main()
{
ifstream reader;
ofstream writer;

string query = "";
string result = "";
char* javaClassPath = "-Djava.class.path=.:../lib/NCnotDep.jar:../lib/CRFPP.jar";
JavaVM* jvm;

cJava::ncIdentify *myiden = new cJava::ncIdentify(jvm);

string fileInName = "/users/testcJava/0-20";
string fileOutName = "/users/testcJava/answer";
string buffer;
  reader.open(fileInName.c_str());
  writer.open(fileOutName.c_str());
  while(getline(reader,query))
  {
  if(query!="")
  {
  result = myiden->getNCresult(query);
  writer<<result;
  writer<<"\n";
  }
  else
  {
  writer<<"\n";
  }
  }
  reader.close();
  reader.clear();
  writer.close();
  writer.clear();
  delete myiden;
}

文章评论

c++调用java 内存泄露的有关问题
漫画:程序员的工作
c++调用java 内存泄露的有关问题
写给自己也写给你 自己到底该何去何从
c++调用java 内存泄露的有关问题
60个开发者不容错过的免费资源库
c++调用java 内存泄露的有关问题
编程语言是女人
c++调用java 内存泄露的有关问题
Java 与 .NET 的平台发展之争
c++调用java 内存泄露的有关问题
Web开发人员为什么越来越懒了?
c++调用java 内存泄露的有关问题
程序猿的崛起——Growth Hacker
c++调用java 内存泄露的有关问题
程序员最害怕的5件事 你中招了吗?
c++调用java 内存泄露的有关问题
老美怎么看待阿里赴美上市
c++调用java 内存泄露的有关问题
当下全球最炙手可热的八位少年创业者
c++调用java 内存泄露的有关问题
那些争议最大的编程观点
c++调用java 内存泄露的有关问题
如何区分一个程序员是“老手“还是“新手“?
c++调用java 内存泄露的有关问题
程序员必看的十大电影
c++调用java 内存泄露的有关问题
5款最佳正则表达式编辑调试器
c++调用java 内存泄露的有关问题
为什么程序员都是夜猫子
c++调用java 内存泄露的有关问题
一个程序员的时间管理
c++调用java 内存泄露的有关问题
程序员应该关注的一些事儿
c++调用java 内存泄露的有关问题
Java程序员必看电影
c++调用java 内存泄露的有关问题
做程序猿的老婆应该注意的一些事情
c++调用java 内存泄露的有关问题
旅行,写作,编程
c++调用java 内存泄露的有关问题
Web开发者需具备的8个好习惯
c++调用java 内存泄露的有关问题
10个帮程序员减压放松的网站
c++调用java 内存泄露的有关问题
程序员都该阅读的书
c++调用java 内存泄露的有关问题
10个调试和排错的小建议
c++调用java 内存泄露的有关问题
亲爱的项目经理,我恨你
c++调用java 内存泄露的有关问题
如何成为一名黑客
c++调用java 内存泄露的有关问题
为啥Android手机总会越用越慢?
c++调用java 内存泄露的有关问题
“肮脏的”IT工作排行榜
c++调用java 内存泄露的有关问题
初级 vs 高级开发者 哪个性价比更高?
c++调用java 内存泄露的有关问题
总结2014中国互联网十大段子
c++调用java 内存泄露的有关问题
老程序员的下场
c++调用java 内存泄露的有关问题
要嫁就嫁程序猿—钱多话少死的早
c++调用java 内存泄露的有关问题
每天工作4小时的程序员
c++调用java 内存泄露的有关问题
程序员眼里IE浏览器是什么样的
c++调用java 内存泄露的有关问题
程序员周末都喜欢做什么?
c++调用java 内存泄露的有关问题
科技史上最臭名昭著的13大罪犯
c++调用java 内存泄露的有关问题
程序员的样子
c++调用java 内存泄露的有关问题
不懂技术不要对懂技术的人说这很容易实现
c++调用java 内存泄露的有关问题
团队中“技术大拿”并非越多越好
c++调用java 内存泄露的有关问题
鲜为人知的编程真相
c++调用java 内存泄露的有关问题
我是如何打败拖延症的
c++调用java 内存泄露的有关问题
什么才是优秀的用户界面设计
c++调用java 内存泄露的有关问题
看13位CEO、创始人和高管如何提高工作效率
c++调用java 内存泄露的有关问题
程序员的一天:一寸光阴一寸金
c++调用java 内存泄露的有关问题
我的丈夫是个程序员