JAVA调用C语言写的SO文件

因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例

1 //用JNI实现2 //实例:3

4 //创建HelloWorld.java

5 classHelloWorld6 {7 private native voidprint();8 public static voidmain(String[] args)9 {10 newHelloWorld().print();11 }12

13 static

14 {15 System.loadLibrary("HelloWorld");16 }17 }18 //注意print方法的声明,关键字native表明该方法是一个原生代码实现的。另外注意static代码段的System.loadLibrary调用,这段代码表示在程序加载的时候,自动加载libHelloWorld.so库。19 //编译HelloWorld.java20 //在命令行中运行如下命令:

21 javac HelloWorld.java22 //在当前文件夹编译生成HelloWorld.class。23 //生成HelloWorld.h24 //在命令行中运行如下命令:

25 javah -jni HelloWorld26 //在当前文件夹中会生成HelloWorld.h。打开HelloWorld.h将会发现如下代码:

27 /*DO NOT EDIT THIS FILE - it is machine generated*/

28 #include

29 /*Header for class HelloWorld*/

30

31 #ifndef _Included_HelloWorld32 #define _Included_HelloWorld33 #ifdef __cplusplus34 extern "C"{35 #endif36 /*

37 * Class: HelloWorld38 * Method: print39 * Signature: ()V40 */

41 JNIEXPORT voidJNICALL Java_HelloWorld_print42 (JNIEnv *, jobject);43

44 #ifdef __cplusplus45 }46 #endif47 #endif48 //该文件中包含了一个函数Java_HelloWorld_print的声明。这里面包含两个参数,非常重要,后面讲实现的时候会讲到。49 //实现HelloWorld.c50 //创建HelloWorld.c文件输入如下的代码:

51 #include

52 #include

53 #include "HelloWorld.h"

54

55 JNIEXPORT voidJNICALL56 Java_HelloWorld_print(JNIEnv *env, jobject obj)57 {58 printf("Hello World!\n");59 }60 //注意必须要包含jni.h头文件,该文件中定义了JNI用到的各种类型,宏定义等。61 //另外需要注意Java_HelloWorld_print的两个参数,本例比较简单,不需要用到这两个参数。但是这两个参数在JNI中非常重要。62 //env代表java虚拟机环境,Java传过来的参数和c有很大的不同,需要调用JVM提供的接口来转换成C类型的,就是通过调用env方法来完成转换的。63 //obj代表调用的对象,相当于c++的this。当c函数需要改变调用对象成员变量时,可以通过操作这个对象来完成。64 //编译生成libHelloWorld.so65 //在Linux下执行如下命令来完成编译工作:

66 cc -I/usr/lib/jvm/java-6-sun/include/linux/

67 -I/usr/lib/jvm/java-6-sun/include/

68 -fPIC -shared -o libHelloWorld.so HelloWorld.c69 //在当前目录生成libHelloWorld.so。注意一定需要包含Java的include目录(请根据自己系统环境设定),因为Helloworld.c中包含了jni.h。70 //另外一个值得注意的是在HelloWorld.java中我们LoadLibrary方法加载的是“HelloWorld”,可我们生成的Library却是libHelloWorld。这是Linux的链接规定的,一个库的必须要是:lib+库名+.so。链接的时候只需要提供库名就可以了。71 //运行Java程序HelloWorld72 //大功告成最后一步,验证前面的成果的时刻到了:

73 java HelloWorld74 //如果你这步发生问题,如果这步你收到java.lang.UnsatisfiedLinkError异常,可以通过如下方式指明共享库的路径:

75 java -Djava.library.path='.'HelloWorld76 //当然还有其他的方式可以指明路径请参考《在Linux平台下使用JNI》。77 //我们可以看到久违的“Hello world!”输出了。

View Code

试着去完成,自己生成了一份com_test_GetMsg.h头文件,并完成test.c,生成libtest.so文件,JAVA调用SO文件时,屡次报:

failed: Cannot load library: load_library(linker.cpp:761): not a valid ELF executable: /data/app-lib/com.example.iccommtest-libtest.so

也就是提供的SO无法load,是valid的。

注意,刚才引用的实例是JAVA调用SO,而我需要的是android调用SO,不然会频繁上面错误。

原因有两点:

1、JAVA和android的虚拟环境不一样

2、Linux和android的系统库文件不一样

这样导致了在Linux下通过JNI标准命名方式编译的SO文件,在android是调用失败的,原因是Linux和android的系统库不一样,而生产的SO跟生产环境库文件有依赖关系,然后搭建了NDK和Cywin环境,然后生产的SO可以被android调用,

那么SO文件就必须完全遵循JNI命名规则,方法名是这样:

/*

* Class: com_samples_jni_test

* Method: GetMsg

* Signature: ()V

*/

JNIEXPORT jstring JNICALL Java_com_samples_jni_test_GetMsg

(JNIEnv *, jobject);

通过NDK和Cywin生产libtest.so,android调用成功!

java 调用c so_JAVA调用C语言写的SO文件相关推荐

  1. JAVA调用C语言写的SO文件

    因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 1 // 用JNI实现 2 // 实例: 3 4 // 创建He ...

  2. c 调用c语言写的dll文件路径,手把手教你用C/C++语言创建及调试动态库DLL程序

    引子 动态链接库DLL文件不仅可以实现代码.资源和数据的共享,同时也可以对源代码起保护作用,对于开发者来讲,DLL的生成及调试是程序员必须掌握的一种技术,下面通过一个具体的例子,演示使用C/C++语言 ...

  3. 用c语言写生成 mif文件的软件,MIF文件生成(.MIF File Generator Utility)

    .MI文件是当你实例化一个ROM或RAM中的示意图或AHDL文件,你必须与一些默认的数据预加载的EAB选项来指定.MIF文件. .MIF File Generator Utility将生成MIF文件正 ...

  4. 用C语言写一个人员文件管理系统(一)

    题目如下: 1.输入三个人的信息(姓名,年龄.性别.家庭住址),并保存到txt文件中.再从文件中读取信息显示在屏幕上: 2.实现人员信息重复显示功能: 3.实现人员信息的添加. 过程如下: 首先建立一 ...

  5. 用c语言写生成 mif文件的软件,生成mif文件的几种方法总结

    mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据.生成QuartusII11.0可用的mif文件,有以下几种方式:html 方法1 ...

  6. java指定位置写入_java指定路径写、读文件

    packagecom.util;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.File;importj ...

  7. c语言 写出raw文件,求指导,如何用c语言实现读取*.raw格式图像

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 /* ** 这个程序是读取jpg图像的 ** 后续加上jpg图像打开和存放 */ #include #include #include #include ...

  8. java 是用什么写的_java里的jvm是用什么语言写的

    JAVA里的jvm虚拟机用的是C语言+汇编语言开发的.在此之上就是JAVA本身了,虚拟机是起到解析作用. 另外,JAVA并不比C语言慢,说JAVA慢一般是九十年代那时候的JAVA. 现在一段优秀的JA ...

  9. JVM 是用什么语言写的?

    JAVA中就虚拟机是其它语言开发的,用的是C语言+汇编语言 基于此之上就是JAVA本身了 虚拟机只起到解析作用 另外,JAVA并不比C语言慢,说JAVA慢一般是九十年代那时候的JAVA, 而现在 在一 ...

最新文章

  1. Kali Linux缺少ifconfig命令
  2. [已经完美解决]IE下 'document.getElementById(...)' is null
  3. go mod引用git仓库中的包:拉取存放在gitee中的package
  4. 面试题:如何编写一个杯子测试用例
  5. 下载的字幕php是什么格式的,mkv是什么文件格式
  6. mac osx 下的 mysql_Mac OSX下的MySQL数据库升级
  7. arm-2009q1-203-arm-none-linux-gnueabi.bin执行错误解决
  8. git解决error: failed to push some refs to ‘xxx(远程库)‘
  9. Android 6 ti dsp,TI DSP TMS320C66x学习笔记之内联指令(c6x.h中文注释)(六)
  10. java与can总线开发_CANdbc编辑器的下载和入门介绍
  11. x9此计算机上没有hasp_中琅条码打印软件安装后弹出HASP错误代码处理方法
  12. 关于磁碟机及Javqhc病毒
  13. 序号 html ol自动缩进,ol自定义序号样式的方法
  14. Altium Designer18之修改画图光标大小
  15. 《Shell脚本学习指南》读书笔记
  16. 谷歌地球out了,谷歌火星来了!
  17. 记录一次服务器被植入挖矿脚本事件
  18. IDEA中pom.xml文件图标变红,而不是蓝问题
  19. 计算机科学与技术专业考数媒,数字媒体技术研究生院校排名
  20. Android Dialer模块联系人搜索

热门文章

  1. Windows操作系统初级教程
  2. ABAP UNITS_STRING_CONVERT 金额显示
  3. 论文笔记 ​​​​​​​---语音关键词检测方法综述
  4. 虎牙直播运维负责人张观石 | 解密SRE的六种能力及虎牙运维实践 1
  5. 随手记理财安全吗?随手记入选原创力企业榜百强
  6. HTML第6章上机练习5(制作爱奇艺视频播放列表)
  7. Docker-Docker Desktop 安装教程,以及推荐Docker作为学习工具的理由
  8. python ostu代码
  9. RabbitMQ 修改默认端口
  10. 电大计算机好考吗,电大大专好考吗