文档章节

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

嘻哈开发者
 嘻哈开发者
发布于 2013/12/30 18:16
字数 646
阅读 155
收藏 0
点赞 0
评论 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
博文 113
码字总数 1519
作品 0
广州
程序员
JNI和NDK的区别

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

鉴客 ⋅ 2012/03/09 ⋅ 0

JNI和NDK的区别

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

晨曦之光 ⋅ 2012/03/01 ⋅ 0

JNI和NDK的区别

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

长平狐 ⋅ 2013/01/06 ⋅ 0

NDK全称 Native Development Kit

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

长平狐 ⋅ 2012/08/29 ⋅ 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 ⋅ 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

Android NDK带来什么 (转)

1、前言 6月26日,Google Android发布了NDK,引起了很多发人员的兴趣。NDK全称:Native Development Kit。下载地址为:http://developer.android.com/sdk/ndk/1.5r1/index.html。 2、误解 新...

GDP_搞地皮 ⋅ 2012/11/27 ⋅ 0

Android之NDK开发

一、NDK产生的背景   Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于 Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同...

豆花饭烧土豆 ⋅ 2016/03/22 ⋅ 1

Android NDK开发简介

最近由于项目的需要,使用到了Android的NDK技术,对项目核心算法跨平台的移植。简答而言,就是使用C对原来的算法进行了改进,并集成到原来的app项目里。 从前的项目一直没有使用NDK进行开发的...

zhiweiofli ⋅ 2013/03/07 ⋅ 0

Android Studio之NDK环境搭建,so文件打包以及使用

本篇入门教程开发环境为mac + Android Studio + gradle 2.14.1,主要包含以下3块内容: NDK环境搭建 编写第一个JNI项目 打包出动态so文件,在其他项目中使用 一、NDK环境搭建 从Android Stu...

ljianbing ⋅ 2017/04/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 21分钟前 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 48分钟前 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 55分钟前 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

容器之查看minikue的environment——minikube的环境信息

执行如下命令 mjduan@mjduandeMacBook-Pro:~/Docker % minikube docker-envexport DOCKER_TLS_VERIFY="1"export DOCKER_HOST="tcp://192.168.99.100:2376"export DOCKER_CERT_PATH="/U......

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部