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

摘要:
编写JNITest。1,在java中声明nativefunc2,编译。使用javah将类转换为.h3,write。c4,并将其打包到。所以动态库。5、加载。所以在Java中,然后可以使用本机方法。生成时。o、 1.它是一个JNI程序,因此C文件包含JNI H目录。或者使用选项-mno-cygwin,但在cygwin下使用此命令时存在问题。如果要更改回usr/bin/set-gcc-default-4.sh或安装MSYS并使用mingw进行编译,命令应为----------------------------------------------------------------------gcc-D_int64=“longlong”-I“/cygdrive/f/ProgramFiles/Java/jdk1.6.0_21/include”-I”/cygdrive/fi/ProgramFiles/Java/jk1.6.0_11/include/win32“-cotest。otun_test_JNI_ C2JAVA.c/usr/bin/set-gcc-default-3.shcc共享olibtest.so Wl,-soname,libtest.so,--kill certificate。O-mno-cygwin--------------------------------------------正确。因此可以生成文件。

写一个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://www.cnblogs.com/xifanyaoyao/p/3659002.html

免责声明:文章转载自《cygwin+windows 使用JNI时 .c文件打包成.so》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mysql远程连接数据库VIM操作指南下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android平台下的JNI开发

JNI是Java Native Interface的缩写,通过JNI可以方便我们在Android平台上进行C/C++编程。要用JNI首先必须安装Android的NDK,配置好NDK环境之后就可以在Eclipse下进行C/C++开发了。 其实JNI的原理很容易理解,其本质就是在Java层定义一个接口,同时在C层用C/C++代码实现该接口的功能并编译成动态链接...

QT5中如何使用QFtp类(这个类虽然没有被收录,但一直在更新)

由于QT5对QML的支持有很大的改进,所以打算将原来基于QT4的程序移植到QT5上,在移植用QFtp类写的程序时傻眼了! Qt5 移除了 QFtp API,原因是其实现质量。QNetworkAccessManager 可以用来提供 ftp url 的上传下载操作。 由于原来的程序已经跑的很稳定了不想做修改,然后就去想其它办法,结果发现官方说这些 API 将...

C++单元测试工具之CPPUnit使用

CppUnit[1]是Micheal Feathers由JUnit移植过来的一个在GNU LGPL条约下的并在sourcefogre网站上开源的C++单元测试框架。(转自百度) 本文是对cppunit的一个初步体验,将分别在windows 7和ubuntu 12上进行尝试 文章本着极端细致的原则,力求让每个第一次接触的人都能按照教程完整实现,同时文章也贴出...

Android:JNI与NDK(二)交叉编译与动态库,静态库

  欢迎关注公众号,第一时间获取最新文章:   本篇目录 一、前言 本篇主要以window开发环境为背景介绍一下NDK开发中需要掌握的交叉编译等基础知识,选window系统主要是照顾大多数读者,mac ,linux操作系统基本是同样适用的。 交叉编译就是在A平台编译出可以在B平台执行的文件,对于我们安卓开发者来说交叉编译就是在window或者mac或者...

Centos6.5安装nodejs13

下载nodejs13二进制压缩包,解压后运行./node提示缺库文件。在网上面试并试了好多次后,记录一下。 缺失库文件的错误提示:   [root@localhost bin]# ./node   ./node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (req...

gcc 编译器参数

一、GCC编译过程 参考:http://hi.baidu.com/zengzhaonong/item/c00e079f500adccab625314f-------------------------------------    Pre-Processing   cpp        预处理    Compiling        ccl       ...