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.pswp.cn/news/257558.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257558.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257558.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ios開發之 -- 自動輪播圖創建

這里是oc版本的,簡單記錄下: 具體代碼如下: 1,準備 #define FRAME [[UIScreen mainScreen] bounds] #define WIDTH FRAME.size.width #define HEIGHT FRAME.size.height 2,具體實現 //scrollview的添加_bigScrollView…

學習進度(2016.3.13)

第二周所花時間(包括上課)14小時代碼量(行)138行博客量(篇)4篇了解到的知識點動態數組的定義初始化和使用,指定范圍獲得隨機數轉載于:https://www.cnblogs.com/zzcs/p/5272365.html

binaryoperator java_BinaryOperatorT接口的用法示例

java Function函數中的BinaryOperator接口用于執行lambda表達式并返回一個T類型的返回值,下面的BinaryOperator用法示例讓你簡單了解一下。import java.util.function.BinaryOperator;public class TestDemo {public static void main(String[] args) {BinaryOperat…

線性表的順序存儲結構之順序表類的實現_Java

在上一篇博文——線性表接口的實現_Java中,我們實現了線性表的接口,今天讓我們來實現線性表的順序存儲結構——順序表類。 首先讓我們來看下順序表的定義: 線性表的順序存儲是用一組連續的內存單元依次存放線性表的數據元素,元素在…

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下&…

JDK source 之 ArrayList 需要注意事項

線程安全 ArrayList內部沒有實現原子性操作,所以是非線程安全的。如果需要在線程安全的環境下使用List的話,需要使用Vector 或者CopyOnWriteArrayList,具體場景,自行深入了解。 擴容算法 // minCapacity 為需要的最小容量 private…

為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 應用能夠管理音頻資源&#…

SqlServer中的數據類型UniqueIdentifier

SqlServer中的數據類型UniqueIdentifier究竟是什么東東?該類型一般用來做為主鍵使用,可用SQL語法的newid()來生成一個唯一的值。我想請問的是,這個值是一個長整型的數據值呢,還是個其他的什么值?我在程序中該怎樣去控制…

《架構探險——從零開始寫Java Web框架》這書不錯,能看懂的入門書

這書適合我。 哈哈,結合 以前的知識點,勉強能看懂。 講得細,還可以參照著弄出來。 希望能堅持 完成啦。。。 原來,JSTL就類似于DJANGO中的模板。 而servlet類中的res,req,玩了DJANGO就覺得好熟悉啦。。。:&…

java 生成 tar.gz_一文教您如何通過 Java 壓縮文件,打包一個 tar.gz Filebeat 采集器包...

一、背景最近,小哈主要在負責日志中臺的開發工作, 等等,啥是日志中臺?俺只知道中臺概念,這段時間的確很火,但是日志中臺又是用來干啥的?這里小哈盡量地通俗的說下日志中臺的職責,再說日志中臺之…

腳本安裝smokeping

我將提供兩種方法來安裝smokeping,一種是大家常用的普通安裝,另一種是用腳本下自動化安裝的,僅供大家學習,參考!普通安裝:centos 5.4下安裝smokeping需要的軟件:(1)httpd(2)rrdtool(3)smokeping(4)fping(5)libwww-perl…

強烈推薦:Android史上最強大的自定義任務軟件Tasker

強烈推薦:Android史上最強大的自定義任務軟件Taskerhttp://bbs.mumayi.com/thread-28387-1-1.html(出處: 木螞蟻手機樂園) Android上的Tasker絕對稱得上是Android系統的神器之一,與Auto Memory Manager不同,Tasker不是加速型的軟件&#xff0…

配置文件*.xml中 classpath: 與 classpath*: 的區別

首先classpath 指的是WEB-INF下面的classes目錄,所有src目錄下面的java、xml、properties等文件編譯后都會在此,classes在eclipse的項目目錄下是看不到的,它存在于部署在服務器上的項目目錄WEB-INF下 classpath:指的是第一個classpath路徑,也…

原型模式 java 深淺_JAVA設計模式---原型模式--淺客隆和深克隆

JAVA淺克隆和深克隆淺克隆:被復制對象的所有變量和原來相同,而所有的對其他對象的引用仍指向原對象。即如果復制的對象修改復制對象的變量,原對象不會改變。而修改引用的對象,二者均會發生改變。深復制(克隆):被復制對…

SocketErrorCode:10022

在編寫.net的網絡服務器時,我使用了裸socket來實現。在windows上,或者在linux上通過.net core來跑時都沒有什么問題,但是通過mono運行調用socket.Bind()時卻總是報ErrorCode為10022的SocketException,表示參數無效。通過命令netst…

request.RequestContextListener

由于是使用spring mvc來做項目&#xff0c;因此脫離了HttpServletRequest作為參數&#xff0c;不能夠直接使用request&#xff0c;要想使用request可以使用下面的方法&#xff1a; 在web點xml中配置一個監聽 [html] view plaincopyprint?<listener> <listen…

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…

POJ 1584 A Round Peg in a Ground Hole(點到直線距離,圓與多邊形相交,多邊形是否為凸)...

題意&#xff1a;給出一個多邊形和一個圓&#xff0c;問是否是凸多邊形&#xff0c;若是則再問圓是否在凸多邊形內部。 分3步&#xff1a; 1、判斷是否是凸多邊形 2、判斷點是否在多邊形內部 3、判斷點到各邊的距離是否大于等于半徑 上代碼&#xff1a; #include <iostream&…