免费注册 查看新帖 |

Chinaunix

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

JNI 调用,求助。 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-17 16:00 |只看该作者 |倒序浏览
需要对 OpenSSL 的一批函数进行 JNI 调用封装。

现在是这个函数中传入的参数有结构体,对应的 java 调用时如何定义?


比如:我的例子如下。

C 程序为:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. struct sj {
  5.         float   sou1;
  6.         float   sou2;
  7.         float   des;
  8. };


  9. int sub(struct sj *a);
  10. int add(struct sj *b);

  11. int sub(struct sj *a){
  12.         a->des = a->sou1 - a->sou2;
  13.         return 0;
  14. }

  15. int add(struct sj *b){
  16.         b->des = b->sou1 + b->sou2 ;
  17.         return 0;
  18. }
复制代码
对于这样的 C 程序,JNI 调用应该如何做?

附:
我的 java 代码及生成的 .h 的文件内容如下:

subadd.java
  1. /*
  2. * To change this template, choose Tools | Templates
  3. * and open the template in the editor.
  4. */

  5. /**
  6. *
  7. * @author work
  8. */


  9. public class CertSys {

  10.     static {
  11.         System.loadLibrary("libCertSys.so");
  12.     }
  13.    
  14.     public class Sj {
  15.         private float a;
  16.         private float b;
  17.         private float c;
  18.         
  19.         public float getA(){
  20.             return a;
  21.         }
  22.         
  23.         public void setA(float a){
  24.             this.a = a;
  25.         }
  26.         
  27.         public float getB(){
  28.             return b;
  29.         }
  30.         
  31.         public void setB(float b){
  32.             this.b = b;
  33.         }
  34.         
  35.         public float getC(){
  36.             return c;
  37.         }
  38.         
  39.         public void setC(float c){
  40.             this.c = c;
  41.         }
  42.     }

  43.     public native static int sub(Sj i);
  44.     public native static int add(Sj j);
  45.    
  46. }
复制代码
.h
文件内容如下:
  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class CertSys */

  4. #ifndef _Included_CertSys
  5. #define _Included_CertSys
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class:     CertSys
  11. * Method:    sub
  12. * Signature: (LCertSys/Sj;)I
  13. */
  14. JNIEXPORT jint JNICALL Java_CertSys_sub
  15.   (JNIEnv *, jclass, jobject);

  16. /*
  17. * Class:     CertSys
  18. * Method:    add
  19. * Signature: (LCertSys/Sj;)I
  20. */
  21. JNIEXPORT jint JNICALL Java_CertSys_add
  22.   (JNIEnv *, jclass, jobject);

  23. #ifdef __cplusplus
  24. }
  25. #endif
  26. #endif
复制代码

论坛徽章:
2
操作系统版块每日发帖之星
日期:2015-08-05 06:20:0015-16赛季CBA联赛之北控
日期:2019-02-13 22:56:03
2 [报告]
发表于 2012-10-18 16:40 |只看该作者
你都是大神了,这得什么级别才可以帮你啊

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2012-10-19 23:03 |只看该作者
回复 2# 346196247


    那个是以前混清茶混来的。

论坛徽章:
0
4 [报告]
发表于 2012-11-14 17:09 |只看该作者
CertSys  a = new CertSys();
a.setA();
.....


CertSys.sub(a);


.. 不知对否。。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2012-11-15 14:39 |只看该作者
@nan_jia晕,我就是不会啊。

论坛徽章:
0
6 [报告]
发表于 2012-11-16 09:46 |只看该作者
用 jNative 比较方便。。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2012-11-16 10:40 |只看该作者
@nan_jia具体如何做,能写一个例子看看么?

就我上面给出的情况,能给一个例子么?

论坛徽章:
0
8 [报告]
发表于 2012-11-16 11:46 |只看该作者
你发出来的JAVA 文件 就是正确的吧。

CertSys  a = new CertSys();
a.setA();
.....


CertSys.sub(a);
这样用就没问题。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2012-11-16 16:27 |只看该作者
@nan_jia你是说我的这个写法是对的?

论坛徽章:
0
10 [报告]
发表于 2012-11-16 16:33 |只看该作者
我看你生成的是没问题的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP