java jni so_java 用jni调用so全过程

这几天一直在研究JNI的开发过程,顺便把NDK环境搭建一起总结下。在windows环境下开发jni需要c/c++编译器的支持,网络上我看很多人使用cygwin。呵呵我不是很喜欢使用它,感觉安装起来挺麻烦的。我使用GNUStep,下载地址http://www.gnustep.org/experience/Windows.html。

b7a2d85f2ea525c0728d8583c8c8591a.png

下载安装后,验证是否成功。打开GNUstep->Shell,输入make -v 和 gcc -v命令,如图所示。

3a846f795d29bdb39c216eda03223dfb.png

配置ndk环境变量,gnustep是模拟linux的环境的,打开gnustep的安装目录下的G:\softinstall\GNUstep\GNUstep\GNUstep.conf文件,添加以下内容:

NDK=/g/softinstall/Android/android-ndk-r8b

export=NDK

说明如果不知道ndk目录在linux下应该是在哪里,你可以打开gnustep的命令窗口,输入mount,就可以找到对应的盘符。

验证环境变量,如下图。 e4f428f97541241330ba0e05167ddadf.png

以上就配置成功了。

下载进入正题啦。Jni的开发步骤。

打开eclipse,新建工程名为testJni。在activity中添加以下代码

packagecom.xzw.jni;

importandroid.os.Bundle;

importandroid.app.Activity;

importandroid.view.Menu;

importandroid.view.MenuItem;

importandroid.widget.TextView;

importandroid.support.v4.app.NavUtils;

/**

*

* @author XuZhiwei (xuzhiwei@gmail.com)

* sina:http://weibo.com/xzw1989

*

* Create at 2012-8-30 上午10:49:45

*/

publicclassMainActivityextendsActivity {

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

}

publicnativeString hello();

static{

System.loadLibrary("testJni");

}

}

编译后的文件在bin目录下,通过javah命令生成c/c++的文件头。如下图

8af9565cadd517312d98425361f9af79.png

会在项目目录下生成jni/com_xzw_jni_TestJni.h。

头文件代码如下:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include 

/* Header for class com_xzw_jni_TestJni */

#ifndef _Included_com_xzw_jni_TestJni

#define _Included_com_xzw_jni_TestJni

#ifdef __cplusplus

extern"C"{

#endif

/*

* Class:     com_xzw_jni_TestJni

* Method:    hello

* Signature: ()Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_com_xzw_jni_TestJni_hello

(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

根据头文件编写c代码

#include 

#include 

jstring

Java_com_xzw_jni_TestJni_hello

(JNIEnv* env, jobject thiz){

return(*env)->NewStringUTF(env,"哈哈完成自动化编译 !");

}

接下来编写 Android.mk,该文件可以直接从NDK的samples下的hello-jni的jni文件下直接靠过来改改就可以了。也贴下代码哈。

# Copyright (C) 2009 The AndroidOpenSource Project

#

# Licensed under the Apache License, Version 2.0 (the "License");

# you may notuse this fileexceptincompliancewiththe License.

# You may obtain a copy ofthe Licenseat

#

#      http://www.apache.org/licenses/LICENSE-2.0

#

# Unless required byapplicable laworagreedtoinwriting, software

# distributed under the License isdistributedonan"AS IS"BASIS,

# WITHOUT WARRANTIES ORCONDITIONSOFANYKIND, either expressorimplied.

# See the License forthe specific language governing permissionsand

# limitations under the License.

#

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := testJni

LOCAL_SRC_FILES := testJni.c

include $(BUILD_SHARED_LIBRARY)

其中你只需要该LOCAL_MODULE和LOCAL_SRC_FILES就可以了。

说明:LOCAL_MODULE是描述模块的,用来给java调用的模块名,会生成对应的libtestJni.so

LOCAL_SRC_FILES就是源文件啦,多个文件空格隔开即可。

接下来,我们要开始编译生成so文件咯。

打开gnustep的命令窗口,进入到项目底下,输入$NDK/ndk-build命令,即可自动生成libs/armeabi/libtestJni.so文件。

31aec463107ee4a1163b1c71ac56b3cc.png

接下来就是java调用来。直接上代码

packagecom.xzw.jni;

importandroid.os.Bundle;

importandroid.app.Activity;

importandroid.view.Menu;

importandroid.view.MenuItem;

importandroid.widget.TextView;

importandroid.support.v4.app.NavUtils;

/**

*

* @author XuZhiwei (xuzhiwei@gmail.com)

* sina:http://weibo.com/xzw1989

*

* Create at 2012-8-30 上午10:49:45

*/

publicclassTestJniextendsActivity {

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

TextView tv = newTextView(this);

tv.setText(hello());

setContentView(tv);

}

publicnativeString hello();

static{

System.loadLibrary("testJni");

}

}

运行结果如下

ea2baae45ee3e3acd7ad1d77f0be19f4.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下安装jdk

参考于:http://www.cnblogs.com/caosiyang/archive/2013/03/14/2959087.html 一、准备阶段 ①下载jdk-6u45-linux-i586.bin,通过xftp上传至Linux系统中 ②在命令行执行 ./jdk-6u45-linux-i586.bin,生成目录jdk1.6.0_45 ③移动到/usr/share下&…

为Tiny4412设备驱动在proc目录下添加一个可读版本信息的文件

http://blog.csdn.net/morixinguan/article/details/77808088 上节,我们明白了proc文件系统的作用,接下来我们在友善之臂已经写好的led驱动的基础上,在proc目录下创建一个文件夹,然后加入led驱动的版本信息读取。 我们在init函数的…

java audiorecord_Android 录音实现(AudioRecord)

上一篇文章介绍了使用 MediaRecorder 实现录音功能 Android录音实现(MediaRecorder) ,下面我们继续看看使用 AudioRecord 实现录音功能。AudioRecord首先看看Android帮助文档中对该类的简单概述: AndioRecord 类的主要功能是让各种 Java 应用能够管理音频资源&#…

《架构探险——从零开始写Java Web框架》这书不错,能看懂的入门书

这书适合我。 哈哈,结合 以前的知识点,勉强能看懂。 讲得细,还可以参照着弄出来。 希望能坚持 完成啦。。。 原来,JSTL就类似于DJANGO中的模板。 而servlet类中的res,req,玩了DJANGO就觉得好熟悉啦。。。:&…

java 生成 tar.gz_一文教您如何通过 Java 压缩文件,打包一个 tar.gz Filebeat 采集器包...

一、背景最近,小哈主要在负责日志中台的开发工作, 等等,啥是日志中台?俺只知道中台概念,这段时间的确很火,但是日志中台又是用来干啥的?这里小哈尽量地通俗的说下日志中台的职责,再说日志中台之…

poj1741 Tree 点分治

入门题&#xff0c;算是对树分治有了初步的理解吧。 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<vector> #define REP(i,a,b) for(int ia;i<b;i) #define MS0(a) memset(…

深入理解 ajax_xhr 对象

2019独角兽企业重金招聘Python工程师标准>>> ajax技术的核心是XMLHttpRequest对象(简称XHR)&#xff0c;这是由微软首先引入的一个特性&#xff0c;其他浏览器提供商后来都提供了相同的实现。 IE5是第一款引入XHR对象的浏览器。在IE5中&#xff0c;XHR对象是通过MSX…

组函数及分组统计

分组函数 SQL中经常使用的分组函数 Count(): 计数 Max()&#xff1a;求最大值 Min()&#xff1a;求最小值 Avg()&#xff1a;求平均值 Sum()&#xff1a;求和 -- 统计emp表中的人数 select count(*) from emp; -- 统计获得奖金的人数 select count(comm) from emp;-- 求全部雇…

两张神图介绍python3和 2.x与 3.x 的区别

有感与第一张图, 做了第二张图.转载于:https://www.cnblogs.com/Vito2008/p/5280393.html

Factorial Trailing Zeroes

https://leetcode.com/problems/factorial-trailing-zeroes/ Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. 解题思路&#xff1a; 再次遇见最讨厌的Math题。 开始的思路&#xff0c;结尾的…

百年难得一见!阿里园区惊现双月争辉奇观!

9月3日晚杭州阿里园区上空突然惊现“双月争辉”奇观&#xff0c;引发路人、员工争相拍照留念狂潮。记者随后深入园区探访&#xff0c;近距离观察“双月奇观”。当晚&#xff0c;热心观众王先生提供线索。王先生路过杭州阿里巴巴园区时&#xff0c;听到有人呼喊&#xff1a;“快…

Spring 事务配置5种方式

Spring配置文件中关于事务配置总是由三个组成部分&#xff0c;分别是DataSource、TransactionManager和代理机制这三部分&#xff0c;无论哪种配置方式&#xff0c;一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化&…

黑客宣称掌握了600多万个Instagram账号的信息

据外媒报道&#xff0c;上周早些时候&#xff0c;歌手兼演员赛琳娜戈麦斯因Instagram账号被盗而发出大量来自前男友贾斯汀比伯的裸照。不过当时很快赛琳娜就拿回了对账号的控制权并删掉了这些裸照。就在大家以为这件事情已经平息的时候&#xff0c;Instagram却被曝光了一个极为…

奇怪吸引子---Aizawa

奇怪吸引子是混沌学的重要组成理论&#xff0c;用于演化过程的终极状态&#xff0c;具有如下特征&#xff1a;终极性、稳定性、吸引性。吸引子是一个数学概念&#xff0c;描写运动的收敛类型。它是指这样的一个集合&#xff0c;当时间趋于无穷大时&#xff0c;在任何一个有界集…

安装SQL2012出现[HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD)设置为 1

本人安装SQL2012出现这个错误&#xff0c;找了三天三夜&#xff0c;终于把问题找出来&#xff0c;共享给有需要的人们&#xff0c;不用重新换系统 错误如下: 1&#xff0c;此问题是系统.net Framework版本冲突&#xff0c;首先下载.net Framework清理工具&#xff08;如:cleanu…

java限制发送短信次数_使用java发送短信验证码码,出现流量限制怎么办?急急急...

注册登录后需要企业认证,直接在某度上找一张清晰有红章的企业营业执照,注意要细心点,要看看有没有水印。我第一次就没注意上传了一张有水印的营业执照&#xff0c;从此这个账号再也没有审核通过了&#xff0c;后面只能换个账号。都是后台人工审核的&#xff0c;比较严格。如果时…

GDKOI2015 Day2

P1 题目描述&#xff1a; 给出一个二分图&#xff0c;选择互不相交的边&#xff0c;使得边覆盖的点权和最大。 solution&#xff1a; 简单DP&#xff0c;用树状数组维护最大值。 时间复杂度&#xff1a;$O(n \log n) $ P2 题目描述&#xff1a; 给出N个或黑或白的元素&#xff…

XMind入门教程

最近在总结一些框架知识的时候&#xff0c;总找不到一款好的软件来画流程图&#xff0c;后来在网上查找这方面的东西&#xff0c;找到了 XMind,发现用来画思维导图还挺好的&#xff0c;看起来思路清晰&#xff0c;美观。那么便将使用的一些经验分享给大家。 1、什么是思维导图&…

java word转图片tiff_不怕复制内容 Word转存TIFF文件这么玩

辛辛苦苦把Word文件敲好&#xff0c;为了不让别人复制走内容&#xff0c;只能看文稿&#xff0c;有些人就选择转存成PDF文件——但是PDF文件依然可以被编辑&#xff0c;还有什么方法能防范呢&#xff1f;其实在Word 2003之前&#xff0c;用户可以通过Microsoft Office Document…

IDC:聚焦6+6,抓住数字化转型商机

今天&#xff0c;IDC中国2015年中国ICT市场趋势论坛巡回系列的第二站在北京举行。论坛的主题为“加速创新实现数字化转型”。 这是最坏的时代&#xff1a;经济增长乏力、实体经济不振、传统行业在被颠覆与重构、IT市场总体增长进入个位数区间、IT第二平台的领导厂商仍在困境中。…