文档章节

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

嘻哈开发者
 嘻哈开发者
发布于 2013/12/30 18:16
字数 646
阅读 175
收藏 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
181
0
JNI和NDK的区别

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

晨曦之光
2012/03/01
1K
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
Android Studio NDK开发

android studio 1.3以前 参考文章:http://www.codeceo.com/article/android-studio-ndk-jni.html http://yanbober.github.io/2015/02/14/androidstudiojni_1/ 一、主要步骤: 1、写带有nat......

GalaxyBruce
2016/03/30
58
0
Android Studio 一个简单的非传统Jni例子

Jni是Java运行、调用C和C++代码的一个中间件,可以理解为是一个转接头。 我的C/C++水平仅限于大学时候的课程的算法例子,还真没拿来写过东西。 首先在Android Studio中安装NDK环境和CMake(让...

她叫我小渝
2017/10/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Charles抓包简单使用

安装Charles, 注册https://blog.csdn.net/qq_25821067/article/details/79848589 打开代理,抓取全部流量 抓移动设备包 移动设备设置代理为当前电脑的Ip地址,端口8888,然后访问chls.pro/...

SuShine
7分钟前
0
0
Elasticsearch的简单操作

package com.dongpeng.es;import java.io.IOException;import java.util.Date;import java.util.HashMap;import java.util.Map;import java.util.concurrent.TimeUnit;impor......

魔法王者安琪拉
9分钟前
0
0
父亲写的散文诗

许飞的单曲《父亲写的散文诗》 一九八四年 庄稼还没收割完 女儿躺在我怀里 睡得那么甜 今晚的露天电影 没时间去看 妻子提醒我 修修缝纫机的踏板 明天我要去 邻居家再借点钱 孩子哭了一整天啊...

简心
11分钟前
0
1
浅谈格雷厄姆的《证券分析》

本杰明-格雷厄姆是价值投资的祖师爷,是巴菲特的师傅,我丝毫不敢对他不敬。他的两本书《证券分析》和《聪明的投资者》是每位做投资者必读的经典之书。 国内读者对《证券分析》作者格雷厄姆的...

酒逢知己千杯少
12分钟前
0
0
非原生app开发app

1.变色龙云,一门app 对域名打包 2.apicloud,wex5,自由平台提供的规则开发 3.react native ,Cordova 框架开发 4.Hbuild IDE打包

妖尾巴
12分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部