java 调用c so_JAVA调用C语言写的SO文件
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文件相关推荐
- JAVA调用C语言写的SO文件
因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 1 // 用JNI实现 2 // 实例: 3 4 // 创建He ...
- c 调用c语言写的dll文件路径,手把手教你用C/C++语言创建及调试动态库DLL程序
引子 动态链接库DLL文件不仅可以实现代码.资源和数据的共享,同时也可以对源代码起保护作用,对于开发者来讲,DLL的生成及调试是程序员必须掌握的一种技术,下面通过一个具体的例子,演示使用C/C++语言 ...
- 用c语言写生成 mif文件的软件,MIF文件生成(.MIF File Generator Utility)
.MI文件是当你实例化一个ROM或RAM中的示意图或AHDL文件,你必须与一些默认的数据预加载的EAB选项来指定.MIF文件. .MIF File Generator Utility将生成MIF文件正 ...
- 用C语言写一个人员文件管理系统(一)
题目如下: 1.输入三个人的信息(姓名,年龄.性别.家庭住址),并保存到txt文件中.再从文件中读取信息显示在屏幕上: 2.实现人员信息重复显示功能: 3.实现人员信息的添加. 过程如下: 首先建立一 ...
- 用c语言写生成 mif文件的软件,生成mif文件的几种方法总结
mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据.生成QuartusII11.0可用的mif文件,有以下几种方式:html 方法1 ...
- java指定位置写入_java指定路径写、读文件
packagecom.util;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.File;importj ...
- c语言 写出raw文件,求指导,如何用c语言实现读取*.raw格式图像
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 /* ** 这个程序是读取jpg图像的 ** 后续加上jpg图像打开和存放 */ #include #include #include #include ...
- java 是用什么写的_java里的jvm是用什么语言写的
JAVA里的jvm虚拟机用的是C语言+汇编语言开发的.在此之上就是JAVA本身了,虚拟机是起到解析作用. 另外,JAVA并不比C语言慢,说JAVA慢一般是九十年代那时候的JAVA. 现在一段优秀的JA ...
- JVM 是用什么语言写的?
JAVA中就虚拟机是其它语言开发的,用的是C语言+汇编语言 基于此之上就是JAVA本身了 虚拟机只起到解析作用 另外,JAVA并不比C语言慢,说JAVA慢一般是九十年代那时候的JAVA, 而现在 在一 ...
最新文章
- Kali Linux缺少ifconfig命令
- [已经完美解决]IE下 'document.getElementById(...)' is null
- go mod引用git仓库中的包:拉取存放在gitee中的package
- 面试题:如何编写一个杯子测试用例
- 下载的字幕php是什么格式的,mkv是什么文件格式
- mac osx 下的 mysql_Mac OSX下的MySQL数据库升级
- arm-2009q1-203-arm-none-linux-gnueabi.bin执行错误解决
- git解决error: failed to push some refs to ‘xxx(远程库)‘
- Android 6 ti dsp,TI DSP TMS320C66x学习笔记之内联指令(c6x.h中文注释)(六)
- java与can总线开发_CANdbc编辑器的下载和入门介绍
- x9此计算机上没有hasp_中琅条码打印软件安装后弹出HASP错误代码处理方法
- 关于磁碟机及Javqhc病毒
- 序号 html ol自动缩进,ol自定义序号样式的方法
- Altium Designer18之修改画图光标大小
- 《Shell脚本学习指南》读书笔记
- 谷歌地球out了,谷歌火星来了!
- 记录一次服务器被植入挖矿脚本事件
- IDEA中pom.xml文件图标变红,而不是蓝问题
- 计算机科学与技术专业考数媒,数字媒体技术研究生院校排名
- Android Dialer模块联系人搜索
热门文章
- Windows操作系统初级教程
- ABAP UNITS_STRING_CONVERT 金额显示
- 论文笔记 ​​​​​​​---语音关键词检测方法综述
- 虎牙直播运维负责人张观石 | 解密SRE的六种能力及虎牙运维实践 1
- 随手记理财安全吗?随手记入选原创力企业榜百强
- HTML第6章上机练习5(制作爱奇艺视频播放列表)
- Docker-Docker Desktop 安装教程,以及推荐Docker作为学习工具的理由
- python ostu代码
- RabbitMQ 修改默认端口
- 电大计算机好考吗,电大大专好考吗