文档章节

cygwin+windows 使用JNI时 .c文件打包成.so

嘻哈开发者
 嘻哈开发者
发布于 2013/12/30 18:16
字数 646
阅读 169
收藏 0

写一个JNI Test.

1、java中声明 native func

2、使用javah 将.class编译得到 .h

3、编写.c

4、打包成.so 动态库

5、JAVA中使用加载.so 然后就可以使用native方法了。

其他步骤问题不大,在打包上卡住了。

一个helloWorld打包的话,只需要

-------------------------------------

1: gcc -c helloWorld -o hello.o

2: gcc -shared libhello.so hello.o

(简单的linux 编译相关命令 http://blog.sina.com.cn/s/blog_4057ab6201018pt8.html

------------------------------------

但是完成一个简单的JNI程序,并可以在JAVA中调用 远不止这些。

只记录需要注意的。

生成.o时

1、是JNI程序,所以 C文件中包含了 所以打包时要包含jni.h的目录。jni.h是JDK中的文件。

如:加入选项(路径指向jni根目录和win32目录)

-I"/cygdrive/f/Program Files/Java/jdk1.6.0_21/include" 

-I"/cygdrive/f/Program Files/Java/jdk1.6.0_21/include/win32" 

2、要加入 -D__int64="long long"  不然会报错。"=".""之类的错误信息。

.o生成.so时 

1、假如选项 --kill-at,如果不加在java中使用.so文件时,可能会报找不到某方法。

       使用dllexp等动态库查看器,可以看到 没使用选项时动态库里的方法名字是 testfunc@8 ,加了之后是 testfunc。 少了@符号。

2、使用cygwin生成出来可能需要 cygwin1.dll这个动态库才能运行。

使用命令 ldd XXXX.so 可以查看其依赖的库,如我的

    ------------------------------------------------------

$ ldd libtest.so

        ntdll.dll => /cygdrive/c/WINDOWS/system32/ntdll.dll (0x7c920000)

        kernel32.dll => /cygdrive/c/WINDOWS/system32/kernel32.dll (0x7c800000)

        cygwin1.dll => /cygdrive/f/workspace/TestJNI/libs/cygwin1.dll (0x61000000)

---------------------------------------------------------

这样的话,使用java导入我们自己的XXXX.so时,就必须先导入cygwin1.dll这个依赖库。

或者 使用选型 -mno-cygwin(在生成.so时使用)但在cygwin下使用这个命令有个问题。

可能会出现

cc: The -mno-cygwin flag has been removed; use a mingw-targeted cross-compiler 错误

因为gcc4(暂时)不支持这个参数

只要运行 usr/bin/set-gcc-default-3.sh  将gcc运行的版本改为gcc-3即可。如果要变回来

usr/bin/set-gcc-default-4.sh

或者装个MSYS使用mingw编译

综上所述,命令应该是

------------------------------------------------------

gcc -D__int64="long long" \

-I"/cygdrive/f/Program Files/Java/jdk1.6.0_21/include" \

-I"/cygdrive/f/Program Files/Java/jdk1.6.0_21/include/win32" \

-c -o test.o tun_test_JNI_C2JAVA.c

/usr/bin/set-gcc-default-3.sh 

cc -shared -o libtest.so -Wl,-soname,libtest.so,--kill-at test.o -mno-cygwin

-------------------------------------------------------

这样就可以生成出一个正确的.so文件了。

离在JAVA中正常使用,还差最后一步了。

在JAVA中导入动态链接库,如果总是出现 

java.lang.UnsatisfiedLinkError: no XXXX in java.library.path” 继续往下看。

JAVA中使用动态链接库 须知

  http://blog.sina.com.cn/s/blog_4057ab6201018rdz.html


本文转载自:http://blog.sina.com.cn/s/blog_4057ab6201018qkq.html

共有 人打赏支持
嘻哈开发者
粉丝 54
博文 114
码字总数 1519
作品 0
广州
程序员
JNI和NDK的区别

NDK(Native Development Kit)“原生”也就是二进制 android常用的开发方式是java封装的库,而这些库的底层实现是由C/C++实现,如媒体,图形库等 java调用这样实现就需要用JNI(Java Native...

鉴客
2012/03/09
147
0
JNI和NDK的区别

NDK(Native Development Kit)“原生”也就是二进制 android常用的开发方式是java封装的库,而这些库的底层实现是由C/C++实现,如媒体,图形库等 java调用这样实现就需要用JNI(Java Native...

晨曦之光
2012/03/01
1K
0
JNI和NDK的区别

NDK(Native Development Kit)“原生”也就是二进制 android常用的开发方式是java封装的库,而这些库的底层实现是由C/C++实现,如媒体,图形库等 java调用这样实现就需要用JNI(Java Native...

长平狐
2013/01/06
30
0
NDK全称 Native Development Kit

1、概述 NDK全称:Native Development Kit。 1、NDK是一系列工具的集合。 * NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具...

长平狐
2012/08/29
193
0
NDK开发——Android Studio2.x配置NDK环境、运行HelloWord

本篇文章翻新旧文章,采用markdown格式,原文时间2016-09-19 23:43 1253人阅读 下载 官网NDK传送门https://developer.android.com/ndk/downloads/index.html,如果没有用hosts免费进行翻墙是...

qq_30379689
2017/09/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开发命令行工具的 12 个最佳实践

简评:设计良好的命令行应用是极富生产力的工具,本文介绍了开发命令行工具的 12 个最佳实践 CLI 是构建产品的绝佳方式,与 Web 应用不同的是它需要的时间更少,并且功能更强大。使用Web,你...

极光推送
31分钟前
5
0
DRAM和NAND Flash合约价持续走下坡路

大伙儿关心的内存和SSD产品价格在年内有望继续迎来一波减价。 据TrendForce旗下的DRAMeXchange发布的最新报告显示,本应该是购物旺季的Q4,DRAM芯片和NAND Flash芯片的合约采购价均呈现疲软的...

linux-tao
36分钟前
1
0
Vue学习记录

Vue学习记录 Vue实例 Vue实例的创建 var vm = new Vue({ // 选项}) 数据冻结 使用 Object.freeze(),这会阻止修改现有的属性,也意味着响应系统无法再追踪变化。 var obj = { foo: 'ba...

BakerZhu
36分钟前
2
0
day124-20181022-英语流利阅读-待学习

靠打零工能走上人生巅峰吗? Daniel 2018-10-22 1.今日导读 “零工经济”,一般指通过网站或 App 获得一些零碎的工作机会,从事不稳定的工作,赚取不稳定的薪水。由于从事这样的工作门槛相比...

飞鱼说编程
41分钟前
2
0
python学习笔记

马克

孙幼凌
50分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部