`
mjm13
  • 浏览: 49743 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JNI调用第三方C++ dll

阅读更多

     最近工作需要要调用第三方厂商提供的dll,学了下JNI,来分享下。

 

     说明:使用JNI来调用dll是JAVA调用符合JNI规范的dll,如需调用第三方的dll是在符合JNI规范的dll中再用c++掉用第三方的dll中的方法。

 

    操作步骤:

    1.新建java类将需要掉用的方法声明为native,增加导入dll的代码,例如:
    

	public static native ArrayList readCard(byte[] dataBuf);

	static {
		System.loadLibrary("XFBankJni");
	}

   其中load的部分不是固定的,C++的项目生成的dll文件名即可

   2.先使用javac命令编译java类,然后使用javah命令编译 会生成“包名_java类名.h”,“.h”为C++中dll的头文件

   3.vs新建一个C++的Win32项目,应用程序类型选择DLL,将生成的头文件拷贝带该项目中。

   4.在生成的项目名.CPP文件中导入该头文件,并实现这些方法。

   5.调用第三方dll,申明方法,加载dll

HINSTANCE hDLL = LoadLibrary(_T("XfBankRwCard.dll"));//加载dll
if(hDLL==NULL){
        return jobjct();
}
typedef int (WINAPI *InnoverCard)(char* dataBuf);//申明第三方dll中方法格式
InnoverCard icard=(InnoverCard)GetProcAddress(hDLL,"innoverCard");//加载dll中的方法
	int result = icard(data);//调用第三方方法

 

 

    碰到的问题:(由于没用过vs,c++所以碰到很多很低级的问题,写在这里希望对跟我一样不博学的人有帮助 ^_^)

  1.     将java生成的“xxx.h”头文件拷贝到vs2010中保存之后各种报错,无法解析JNIEXPORT等JNI关键字。
    解决方法:VS中在项目上右键打开属性 -> C/C++ -> 常规-> 附加包含目录: 添加jni对应的头文件
  2. VS报错找未定义标识符 malloc,_T()
    解决方法:增加导入#include "malloc.h",#include "tchar.h"
  3. VS中自己新增的本地方法也报 未定义标识符 “函数名”
    解决方法:将自己写的工具方法增加到文件的include下方,
  4. C++中设置的char数组接收后显示错误
    解决方法:增加分配内存的方法memset(char数组, 0, sizeof(char数组));
  5.  在JNI中返回List对象,C++中的对象不能直接塞到list中需要转换为java对象 java才能接收否则会为null
        jclass cls_ArrayList = env->FindClass("java/util/ArrayList");  
        jmethodID construct = env->GetMethodID(cls_ArrayList,"<init>","()V");  
        jobject obj_ArrayList = env->NewObject(cls_ArrayList,construct,"");  
        jmethodID arrayList_add = env->GetMethodID(cls_ArrayList,"add","(Ljava/lang/Object;)Z");  
    
    	env->CallObjectMethod(obj_ArrayList,arrayList_add,makeInteger(env,result));
    	env->CallObjectMethod(obj_ArrayList,arrayList_add,makeDouble(env,test));
  6. C++中inout参数的调用写法
            char* databufChar = (char*)env->GetByteArrayElements(databuf, 0);  
    	double cardgases = 0;
    	char cardno[11];
    	memset(cardno, 0, sizeof(cardno));
    	
    	int result = readCard(databufChar,(char*)cardno,&cardgases);
     
  7. JNI char*转String工具方法
    jstring stoJstring(JNIEnv *env, char* str){
    	jstring rtn = 0;
        int slen = strlen(str);
        unsigned short * buffer = 0;
        if( slen == 0 )
            rtn = (env)->NewStringUTF(str );
        else
        {
            int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
            buffer = (unsigned short *)malloc( length*2 + 1 );
            if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length )>0 )
            rtn = (env)->NewString( (jchar*)buffer, length );
        }
        if( buffer )
            free( buffer );
        return rtn;
    } 

参考资料:

http://www.cnblogs.com/AnnieKim/archive/2012/01/01/2309567.html

http://blog.csdn.net/u_xtian/article/details/6033963

网上找的jni基础类型转java对象工具方法:

https://database.cs.brown.edu/svn/hstore/branches/newdtxn-branch/third_party/cpp/tpceloader/drivers/JNIUtils.cpp

  • 大小: 116.2 KB
分享到:
评论

相关推荐

    jni调用第三方dll最简单的实例

    总结来说,这个实例展示了如何使用JNI调用第三方DLL的基本步骤:在Java中声明native方法,生成JNI头文件,实现C/C++代码并调用DLL函数,最后编译生成本地库。虽然这是一个简单的例子,但理解这些基本概念对于深入...

    JNI调用第三方dll实例

    在本实例中,我们将深入探讨如何使用JNI调用第三方DLL(动态链接库)文件,这是在Java应用程序中利用C++或C代码能力的常见场景。这个实例是在Visual Studio 2010环境下构建的,但请注意,其他环境可能需要不同的配置...

    Java JNI例子-创建DLL、项目导入DLL、IDEA配置JNI、JNI调用DLL(该DLL同时依赖第三方DLL)

    Java JNI例子-创建DLL、项目导入DLL、IDEA配置JNI、JNI调用DLL(该DLL同时依赖第三方DLL)

    通过JNI调用第三方动态库(生成两个.so文件)

    本示例将详细介绍如何通过JNI调用第三方动态库,并生成两个.so文件。 首先,我们需要了解.so文件在Android中的角色。在Linux系统(包括Android)中,.so文件是共享库的扩展名,这些库通常包含了C/C++编译的原生代码...

    JAVA项目JNI调用dll实现DEMO源码,C++&JAVA

    完整的实现java跨平台调用C程序源码,包含JAVA源码和C源码以及编译后的demo dll。将dll放到jdk bin目录下,java 项目可以直接运行。若要修改dll可以,修改C源码后重新编译生成dll。该demo处理了多线程调用c,全局...

    jni调用第三方dll最简单的实例.rar

    总之,JNI调用第三方DLL涉及Java和C/C++的交互,需要理解JNI接口、本地方法的声明和实现,以及如何加载和使用DLL。通过这样的方式,开发者可以在Java应用中充分利用本地代码的性能优势,同时保持Java的跨平台特性。

    jni调用c++ delphi中的dll.

    JNI(Java Native Interface)是Java平台提供的一种标准接口,用于在Java...通过以上步骤,你就可以成功地在Java程序中通过JNI调用C++和Delphi编写的DLL函数了。这在需要利用现有本地库或执行低级操作的场合非常有用。

    Java通过JNI调用C++的DLL文件.docx

    Java 通过 JNI 调用 C++ 的 DLL 文件 JNI(Java Native Interface)是一种允许 Java 代码和本地应用程序交互的技术。通过 JNI,Java 应用程序可以调用本地库,反之亦然。本文将详细介绍如何使用 JNI 将 Java 应用...

    JNI DEMO:java jni技术 调用 c/c++ 的dll

    在这个DEMO中,我们看到有get()和set()两个方法,这些都是通过JNI调用C/C++实现的。在Java中,这些方法会声明为native,并且没有具体的实现。然后,使用`javah`工具,根据Java类生成相应的C/C++头文件。在C/C++代码...

    java调用第三方C++ dll 实例源码和说明

    本文将详细介绍如何在Java中调用第三方C++编写的DLL,并接收C++结构体的数据。 首先,理解Java与C++之间的接口通信至关重要。当Java程序需要调用C++函数时,我们需要编写一个JNI头文件,这个头文件定义了Java和C++...

    [测试通过]JAVA调用第三方DLL的简单方法:JNA及DEMO

    在IT行业中,有时我们需要在Java程序中调用第三方的DLL(动态链接库)文件,这通常是C或C++编写的库。Java Native Access (JNA) 是一个流行的开源框架,它允许Java代码直接调用本机库函数,而无需编写JNI(Java ...

    java写的一个使用jni调用c/c++的dll

    本文将深入探讨如何使用Java通过JNI调用C/C++编写的DLL动态链接库。 首先,JNI提供了一个标准的方法,让Java代码可以与本地代码交互,如C/C++。在Java程序中,我们定义`native`方法,这些方法的实现不在Java字节码...

    JNI调用第三方库文件

    通过JNI调用第三方库文件,可以充分利用C/C++的性能优势,同时保持Java的跨平台能力。需要注意的是,由于涉及到多层语言之间的交互,因此调试和性能优化可能会比较复杂。在实际应用中,需要对Java和C/C++都有深入的...

    JAVA如何调用dll:用JNI调用C或C++动态联接库原来如此简单

    JNI允许Java代码和其他语言写的代码进行交互,包括调用C/C++编译的动态链接库(DLL)文件。下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,...

    C++库封装JNI接口-实现java调用c++

    Java程序可以通过JNI调用本地方法,这些本地方法是用其他语言编写的,并通过JNI接口暴露给Java。这个过程涉及到以下几个步骤: 1. **创建本地方法声明**:在Java类中,你需要声明本地方法。这些方法没有具体实现,...

    JAVA通过JNI调用C#dll的整个项目工程

    本项目工程提供了完整的Java、C++和C#的示例,可以帮助开发者理解如何在实际项目中实现Java通过JNI调用C# DLL的过程,从而提升应用的性能或实现特定的功能。通过学习和实践这个工程,开发者可以进一步提升跨语言编程...

    在windows中jni(生成dll)Linux中jni(生成so),java调用曾c++

    在本主题中,我们将深入探讨如何在Windows和Linux环境中利用JNI来生成动态链接库(DLL for Windows,SO for Linux),并使Java能够调用C++编写的函数。 1. **Java调用C++的基本原理** - JNI为Java应用程序提供了一...

    Java JNI 调用C++ API/dll 示例程序

    完整的展示了Java调用C++ API/dll示例程序. 说明如下: 1. mrSocketAPICInt是准备被java调用的API 2. mrSocketAPIJavaInt是java调用C++ api的中间层 3. mrSocketAPIJavaIntDemo是java程序,展示与C++ api如何对接。...

    visual studio 2019下C++通过JNI调用JAVA代码

    在本文中,我们将深入探讨如何在Visual Studio 2019环境下使用C++通过Java Native Interface (JNI)来调用Java代码。JNI是Java平台的一部分,它为Java应用程序提供了与本地代码交互的能力,使得开发者可以将Java应用...

    java使用JNI调用C++ dll库用法概述

    Java使用JNI(Java Native Interface)调用C++ DLL库是一种常见的技术,特别是在需要利用Java的跨平台特性同时利用C++的高效性能时。JNI提供了一种桥梁,使得Java代码能够直接与本地代码交互,比如C++编译的动态链接...

Global site tag (gtag.js) - Google Analytics