ubuntu下,C/C++通过JNI调用 JAVA类

之前写过一个实现了某种功能的java程序,但由于近日“工作”需要,又需要在c/c++中重新使用该功能。为了节省时间,我采取了在c/c++中调用java程序的方法,但之前没有接触过类似的东西,到网上一查,果然有类似的东西,心中暗喜ing...。查到的资料中有几个不错的网页:

         http://blog.sina.com.cn/s/blog_48eef8410100fjxr.html
         http://www.diybl.com/course/6_system/linux/Linuxjs/20100331/201638.html
 
         http://hi.baidu.com/pjdashu/blog/item/5e54df9961040d006e068c1b.html

第一个网址,主要介绍了安装java环境和编译过程;

第二个网址,主要介绍了jni的使用方法。第三个网址,最后的代码比较明确的说明了如何使用里面的字符串,可以直接看最后一段的代码。我按照第一个网址的方法进行实验,发现了好多的问题。先把主要应该注意的地方记录如下:

(我使用的环境是:Ubuntu8.04)
安装配置Java环境以及编译

安装java环境时,我参照了 http://wiki.ubuntu.org.cn/Java安装配置 的安装配置方法,安装的是java6。下面的配置路径可能根据系统的不同,略有不同。在ubuntu下默认是安装到了/usr/lib/jvm下。 然而,此处的说法:“ 要使配置生效必须重启机器或者在命令行输入 ”并不完全正确,最起码对于LD_LIBRARY_PATH来说不正确,因为有资料显示:

貌似 Ubuntu 不能在 profile, environment,.bashrc中设置 LD_LIBRARY_PATH, 可以这样解决库装载问题:
编辑 /etc/ld.so.conf 文件,将指定的路径加上,或者在 /etc/ld.so.conf.d/ 目录中添加一个新的配置文件,内容看一下该目录下其它文件就明白了。。。当然你得有权限这么做。(http://forum.ubuntu.org.cn/viewtopic.php?f=56&t=94830

       我的做法 要么每次使用之前,要么先运行“. /etc/environment”,要么“export LD_LIBRARY_PATH= $JRE_HOME/lib/i386/client

       配置过程中我还参照了第一个网址中的内容:

JAVA_HOME=/usr/local/java/jdk1.5.0_06

PATH=$PATH:/usr/local/java/jre1.5.0_05/bin

export JAVA_HOME PATH

export JRE_HOME=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JRE_HOME/lib/i386:$JRE_HOME/lib/i386/client

 


出现在jni使用过程中的java.lang.OutOfMemoryError: Java heap space 错误
     jni运行一段时间就会因java.lang.OutOfMemoryError: Java heap space而终止。如果是在纯java环境中,我们可以使用脚本:JAVA -Xms80m -Xmx256m -jar yourApp.jar,但是程序现在的运行情景是:linux下通过c/c++使用jni调用java,幸好的是jdk1.2开始支持了这种设置:
    你可以在虚拟机初始化的时候,指定响应的选项,例如:

这样就对jvm指定最大内存设为64m,最小为4m。(Xms Xmx:这篇文章也许对你有帮助http://1zebra.javaeye.com/blog/561027 )。如果你这样做了,发现问题仍然没有得到解决,那么你应该从自己的代码入手,解决这个问题了,下面一段代码对你会有帮助的:

JNIEnv *env;
jclass  clsHASHMAP;
jmethodID  ArrayList_add, ArrayList_get, ArrayList_size, HashMap_put, HashMap_init;
jstring key, value;
jobject objHashMap;

/* get class. */
clsHASHMAP = (*env)->FindClass(env,"Ljava/util/HashMap;");
/* get init method for HashMap */
HashMap_init =  (*env)->GetMethodID(env,clsHASHMAP, "<init>", "()V");
/* Call HashMap.init() to get a hashmap object */
objHashMap = (*env)->NewObject(env, clsHASHMAP, HashMap_init); 

HashMap_put = (*env)->GetMethodID(env, *clsHASHMAP, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
key = (*env)->NewStringUTF(env, "xxx");
Value = (*env)->NewStringUTF(env, "xxx");
/* put key/value to hashmap. */
(*env)->CallObjectMethod(env, objHashMap, HashMap_put, key, value);

/* 内存回收 */
(*env)->DeleteLocalRef(env, key);
(*env)->DeleteLocalRef(env, value);
(*env)->DeleteLocalRef(env, objHashMap);

也就是说要注意资源的释放(http://hyy115.blog.sohu.com/105289076.html )。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值