JNI中dll调用dll

 在上一篇文章中我谈了jni的基础知识,现在有人向我提出如何在dll中调用dll这个问题。刚开始我也一筹莫展,不知道如何去解决这个问题,找了一些资料,还是那篇文章“VC DLL简单教程”给了我启发。我可以先用vc++写一个dll,然后使用JNI的方法来调用这个dll,就实现了dll调用dll的目的了。我把我的实现过程写下来:

 

(1).在vc++中新建一个Win32 Dynamic-Link Library工程,名称为A,写一个c++源文件:code.cpp,其内容    为:
     #include"iostream.h"

      extern "C" 
       int _declspec(dllexport) add(int a ,int b)
      {
          return a+b;
       }

 

     然后编译-->Build,在A工程的debug文件夹里得到一个A.dll文件

(2).按照JNI 的方法,在java工程里面声明一个getNumber(int a,int b)的本地方法:

public class Pick {

 /**
  * @param args
  */
 public native int getNumber(int a,int b);
 public static void main(String[] args) {
   }
}

 

然后在vc++中调用刚才的A.dll中的方法来实现该方法的功能,再建一个DLL工程B,添加三个头文件后,新建一个c++源文件mode.cpp 代码为:

#include<iostream.h>
#include<Windows.h>
#include"pp_Pick.h"

/*
 * Class:     pp_Pick
 * Method:    getNumber
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_pp_Pick_getNumber
  (JNIEnv * env, jobject o, jint x, jint y)
{
    typedef int (*ADD)(int ,int);//函数指针类型
 HINSTANCE Hint = ::LoadLibrary("A.dll");//加载我们刚才生成的dll
 ADD add = (ADD)GetProcAddress(Hint,"add");//取得dll导出的add方法
 return add(x,y);

 FreeLibrary(Hint);
}

编译,生成B.dll

 

(3).然后把A.dll和B.dll都放进java工程根目录下,调用B.dll,运用getNumber(int a,int b)方法。

public class Pick {

 /**
  * @param args
  */
 public native int getNumber(int a,int b);
 public static void main(String[] args) {
  // TODO Auto-generated method stub
          System.loadLibrary("B1");
          Pick p=new Pick();
          System.out.println(p.getNumber(1, 100));
 }
}

运行,输出结果为:101

 

至此,dll调用dll的功能已经实现============。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值