关闭

编写JNI的一点心得

标签: jniDLLMyEclipse
221人阅读 评论(0) 收藏 举报
分类:

    在公司一直负责向windows平台提供动态库,最多的就是给C#调用。然而Windows端项目差点夭折,同事写的算法,让医学影像损失严重。我不得不亲手编写,导致项目时间紧迫,越急越乱。
    然而在BS端,如今也需要调我的动态库,由于我一直没有写过JNI,于是给同事去整理,结果他花了两天时间,仍然没能调通。今天还是得自己动手。
    网上了解了一下,编写JNI的基本步骤。
    ①不用IDE,直接用编辑器编写类文件,cmd编译成class,生成头文件
    ②用MyEclipse新建项目,而且带有包名,仍然用cmd生成头文件
    第一种情况下,很顺利就通过了,只是不知道为什么动态库里的日志都没有打印,开始以为动态库没有加载成功,于是加了一些终端输出,来调试,确实是正常执行了。
    第二种情况,开始一直报java.lang.UnsatisfiedLinkError这个异常,在网上看到别人说什么,动态库必须用C来实现,文件后缀要是.c,让我那么大一个C++动态库用C再实现一遍,简直想自杀。不相信,继续找方法,有人还说是环境,或者是MyEclipse配置问题,可以在看到那个异常,明显是函数已经加载了,好像参数不匹配似的。
    详细情况是这样的:
    工程名:PatientService
    类名PatientServiceImpl 应同事要求,加    包名package com.annet.service;

public class PatientServiceImpl {
static
{
System.loadLibrary(“PatientServiceImpl”);
}
public native boolean init(String strSvrIP, int nPort);
public native String selectAllPatient(String strDeptNo);
public static void main(String args[])
{
}

    在cmd下生成头文件,com_annet_service_PatientServiceImpl.h
于是在vs2012新建DLL工程,PatientServiceImpl,自动生成PatientServiceImpl.cpp,添加jdk下的两个目录jdk/include和jdk/include/win32,由于这个动态库只是一个外壳,将C++动态在包装一下(避免重新将C++代码都改为JNI)要将工程设置为多字节。然后将刚刚生成的头文件添加过来,编译,成功。
    有没有注意到,头文件是com_annet_service_PatientServiceImpl.h,而cpp文件是PatientServiceImpl.cpp,一般在编写C++代码的时候,头文件和CPP文件都会成对出现,但是不成对出现的话,会不会有问题呢?理论上是没问题的,但是这里这样用却导致Java调用时出错了。
    最后的做法是,新建DLL工程com_annet_service_PatientServiceImpl,让CPP文件名和最后生成的动态库名字都是com_annet_service_PatientServiceImpl,而且在Java调用的时候,也是System.loadLibrary(“com_annet_service_PatientServiceImpl”); 这样才顺利让J2EE项目顺利启动,并成功调用C++动态库。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

android开发——关于编写JNI

最近由于要开发android支付应用,实现刷卡读取磁卡的数据功能,需要编写JNI调用C语言底层库,在学习过程中也遇到了一些困难和问题,在这里记录下来,希望能给遇到同样问题的朋友提供帮助,避免走弯路。通...
  • sdvch
  • sdvch
  • 2013-12-23 00:23
  • 3579

Android JNI编程(七)——使用AndroidStudio编写第一个JNI程序

1.简单介绍一下NDK和JNI NDK:NDK是Native Development Kit的缩写,是Google提供的一套工具集,可以让你其他语言(C、C++或汇编)开发 Android的 JNI。...
  • a_zhon
  • a_zhon
  • 2016-11-09 12:44
  • 4662

编写android程序调用jni本地方法的实现(详细例子)

在写android程序的时候会用到jni,接下来的代码讲诉C实现,环境配置请看我其他的博客,不多说,直接上代码,代码上几乎每一句都会解释,绝对易懂 #include "com_ndk_test_Jni...
  • u012083681
  • u012083681
  • 2014-04-06 20:46
  • 2011

Android JNI 手把手教你编写.so并调用接口

最近在看了很多JNI资料,用了各种方法,但个人却喜欢这种方式,废话不多说。 一、在android源码package目录下创建一个文件夹TestJni,并创建两个目录,分别为test_jni.cpp...
  • Fighting4344
  • Fighting4344
  • 2014-12-26 17:43
  • 1279

编写第一个jni入门程序

1:首先,开发之前,我们有必要先了解ndk与jni,可能有很多人都知道这2个单词,甚至它们的全称,但它们到底与Android有什么联系,可能就很少人知道,或者只懂皮毛。下面我就附上一个链接,介绍And...
  • qq_17387361
  • qq_17387361
  • 2016-08-26 15:21
  • 496

编写优雅程序的一点小小心得

初的程序 现在,为了突出我们的主题,这里给出一个简化版本的只有 17 行的 CUI 程序 ConsoleColorCuiTester.cs: 01: using System; 02: u...
  • u013948187
  • u013948187
  • 2015-07-28 07:40
  • 287

Android通过JNI调用驱动程序(完全解析实例)

要达到的目的:android系统中,用JAVA写界面程序,调用jni中间库提供的接口,去操作某个驱动节点,实现read,writer ioctl等操作!这对底层驱动开发人员是很重要的一个调试通道,也是...
  • brandon2015
  • brandon2015
  • 2016-08-31 14:43
  • 1425

关于WAS一点心得

使用WAS的时候不多,根据最近使用的情况不吐不快啊: 整体情况:使用WAS集群版,也就是所谓的ND版吧;这个主要是为了信息枢纽而建设的一个项目,以各个省份服务器与北京中央服务器进行信息集成,也即是W...
  • baidu_34051990
  • baidu_34051990
  • 2016-10-10 17:28
  • 208

手把手教你JNI接口编写流程

编译的目标平台为X86架构,本地终端可以直接调用执行。整个构建的流程是从上到下(Java->C)构建。 第一步,编写自己的MyJni.java类,如下: public class MyJni { ...
  • DKBDKBDKB
  • DKBDKBDKB
  • 2016-07-28 18:51
  • 434

编写JNI的两种应用层与JNI层方法映射方式

通常我们在编写的JNI 时,在定义上层应用层需要调用的函数中,我们需要对该函数进行应用层与JNI层方法之间的映射。这样上层的Android应用程序才能正确的调用我们的JNI函数,这种映射的方式一共有两...
  • JansonZhe
  • JansonZhe
  • 2015-09-22 11:11
  • 1163
    个人资料
    • 访问:13247次
    • 积分:240
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:3篇
    • 译文:0篇
    • 评论:1条
    最新评论