免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1303 | 回复: 0
打印 上一主题 下一主题

jni实践 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-22 20:34 |只看该作者 |倒序浏览
因项目需要说要使用一个由c编写的动态作为加密算法进行调用因此提前学习一下jni的使用方法,在网上也搜索到了不少资料,不过有好多资料差不多都一样的,看资料挺简单的不过用真正写个例子确实出现了不少问题,我用的环境是solaris就是
www.unix-center.net提供的试验环境,呵呵趁机学习一下!
因为是测试的学习的例子所以写的不是很规范不过例子是可以使用的,以下是java的代码,以下代码只表示调用和编写的基本方法,没有什么实际的意义。


public class testparam
{
/*定义加载的动态连接库的名称在这里的param名称对应的是系统库名称是libparam.so使用的动态库方式*/
         static {
                 System.loadLibrary("param");
         }
      //定义调用的本地方法,
         public native void sayworld(byte[] msg);
         public native byte[] getmsg();
         
         public String getreturnmsg(){
                 byte[] msg=getmsg();
                 String rs=new String(msg);
                 return rs;
         }
         public void saymsg(String msg){
                 byte[] msgbyte=msg.getBytes();
                 byte[] temp={0};
                 byte[] param=new byte[msgbyte.length+temp.length];
                 System.arraycopy(msgbyte,0,param,0,msgbyte.length);
                 System.arraycopy(temp,0,param,msgbyte.length,temp.length);
                 sayworld(param);
         }
         public static void main(String args[]){
                 testparam p=new testparam();
                 p.saymsg("hello world!");
                 p.saymsg("hello world!\n");
                 p.saymsg("heheheheheheheheheheheheheheheheheheheheheheheeheheheh\t\b\n\r");
                 String abc=p.getreturnmsg();
                 System.out.println(abc+":getmsg()");
         }
}

使用javac名称对上述文件进行编译生成class文件,然后使用javah命令使用class文件生成.h头文件,生成的头文件如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include jni.h>
/* Header for class testparam */
#ifndef _Included_testparam
#define _Included_testparam
#ifdef __cplusplus
extern "C" {
#endif
/*
  * Class: testparam
  * Method: sayworld
  * Signature: ([B)V
  */
JNIEXPORT void JNICALL Java_testparam_sayworld
   (JNIEnv *, jobject, jbyteArray);
/*
  * Class: testparam
  * Method: getmsg
  * Signature: ()[B
  */
JNIEXPORT jbyteArray JNICALL Java_testparam_getmsg
   (JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif

根据.h文件中的方法定义开始编写.c文件,.c文件的内容如下:

#include "testparam.h"
#include "jni.h"
#include stdio.h>
  JNIEXPORT void JNICALL Java_testparam_sayworld
    (JNIEnv *env, jobject obj, jbyteArray msg)
{
         jbyte *msgarr=(*env)->GetByteArrayElements(env,msg,0);
         char * chmsg=(char *)msgarr;
         printf("%s\n",chmsg);
}
JNIEXPORT jbyteArray JNICALL Java_testparam_getmsg
   (JNIEnv *env, jobject obj)
{
         char *b="aaaaaaaaaaaaaaa";
         jbyteArray abc= (*env)->NewByteArray(env,10);
         (*env)->SetByteArrayRegion(env,abc,0,10,(const signed char*)b);
         return abc;
}

使用如下命令进行编译.c文件使其生成目标文件,其中paramfun.c为上边的c文件名称
cc -c paramfun.c -I/usr/jdk/instances/jdk1.5.0/include -I/usr/jdk/instances/jdk1.5.0/include/solaris

在生成目标文件后,使用如下命令生成动态库文件:

cc -o libpara.so -G paramfun.o
至此动态连接库生成可以运行java的class进行调用察看运行结果
使用如下命令运行,

java -Djava.library.path=. testparam
由于编译生成的动态连接文件在当前目录下所以需要制定java的java.library.path目录,从当前目录开始加载动态库文件


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/18014/showart_344741.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP