當前位置:九游会j9娱乐平台-九游ag登录中心网址 » 安卓系統 » androidjni函數

androidjni函數-九游会j9娱乐平台

發布時間: 2024-07-15 10:37:41

ⅰ android jni 筆記 | getobjectclass、findclass和getmethodid

  jclass getobjectclass(jobject obj)

使用小栗子 (其中的 getmethodid 函數請往下看) :

jclass findclass(const char* name)

小栗子:

  jmethodid getmethodid(jclass clazz, const char* name, const char* sig)
 參數一: jclass 查找到的java
 參數二: const char* name 方法名

 參數三: const char* sig 方法的返回值

小栗子:

ⅱ 如何在android的jni線程中實現回調

您好,很高興能幫助您如果是c/c 回調,你只要參考linux的線程指南,在線程函數中傳入回調函數地址就行了。如果是要回調到java層,稍微復雜點。首先,你需要在onload的時候,找到回調函數所在的類,用全局變數保存:jniexportjintjnicalljni_onload(javavm*vm,void*reserved){loge("jni_onloadstart");jintversion;g_vm=vm;//全局變數保存jnienv*env;jobjectcls;version=vm->getenv((void**)&env,jni_version_1_2);if(env){g_clazz=env->findclass(class_customsurfaceview);//全局變數保存}loge("jni_onloadfinishg_clazz=0x%x",g_clazz);returnjni_version_1_2;}在jni啟動線程的時候,需要把線程掛到jvm上,不然不能訪問java。你有了g_vm,g_clazz,以及env,就可以做回調操作了。//線程函數void*threadfunc(void*data){jnienv*env=mnull;intret=g_vm->attachcurrentthread((jnienv**)&env,mnull);//掛到jvmif(retdetachcurrentthread();//從jvm卸載return;}你的採納是我前進的動力,記得好評和採納,答題不易,互相幫助,

ⅲ 如何在android下使用jni

1.引言
我們知道,android系統的底層庫由c/c 編寫,上層android應用程序通過java虛擬機調用底層介面,銜接底層c/c 庫與java應用程序間的介面正是jni(javanative interface)。本文描述了如何在ubuntu下配置androidjni的開發環境,以及如何編寫一個簡單的c函數庫和jni介面,並通過編寫java程序調用這些介面,最終運行在模擬器上的過程。

2.環境配置

2.1.安裝jdk1.6
(1)從jdk官方網站下載jdk-6u29-linux-i586.bin文件。
(2)執行jdk安裝文件
[html] view plainprint?
01.$chmod a x jdk-6u29-linux-i586.bin
02.$jdk-6u29-linux-i586.bin
$chmod a x jdk-6u29-linux-i586.bin
$jdk-6u29-linux-i586.bin
(3)配置jdk環境變數

[html] view plainprint?
01.$sudo vim /etc/profile
02.#javaevirenment
03.exportjava_home=/usr/lib/java/jdk1.6.0_29
04.exportjre_home=$java_home/jre
05.exportclasspath=$java_home/lib:$jre_home/lib:$classpath
06.exportpath=$java_home/bin:$jre_home/bin:$path
$sudo vim /etc/profile
#javaevirenment
exportjava_home=/usr/lib/java/jdk1.6.0_29
exportjre_home=$java_home/jre
exportclasspath=$java_home/lib:$jre_home/lib:$classpath
exportpath=$java_home/bin:$jre_home/bin:$path
保存後退出編輯,並重啟系統。

(4)驗證安裝

[html] view plainprint?
01.$java -version
02.javaversion "1.6.0_29"
03.java(tm)se runtime environment (build 1.6.0_29-b11)
04.javahotspot(tm) server vm (build 20.4-b02, mixed mode)
05.$javah
06.用法:javah[選項]<類>
07.其中[選項]包括:
08.-help輸出此幫助消息並退出
09.-classpath<路徑>用於裝入類的路徑
10.-bootclasspath<路徑>用於裝入引導類的路徑
11.-d<目錄>輸出目錄
12.-o<文件>輸出文件(只能使用-d或-o中的一個)
13.-jni生成jni樣式的頭文件(默認)
14.-version輸出版本信息
15.-verbose啟用詳細輸出
16.-force始終寫入輸出文件
17.使用全限定名稱指定<類>(例
18.如,java.lang.object)。
$java -version
javaversion "1.6.0_29"
java(tm)se runtime environment (build 1.6.0_29-b11)
javahotspot(tm) server vm (build 20.4-b02, mixed mode)
$javah
用法:javah[選項]<類>
其中[選項]包括:
-help輸出此幫助消息並退出
-classpath<路徑>用於裝入類的路徑
-bootclasspath<路徑>用於裝入引導類的路徑
-d<目錄>輸出目錄
-o<文件>輸出文件(只能使用-d或-o中的一個)
-jni生成jni樣式的頭文件(默認)
-version輸出版本信息
-verbose啟用詳細輸出
-force始終寫入輸出文件
使用全限定名稱指定<類>(例
如,java.lang.object)。2.2.安裝android應用程序開發環境
ubuntu下安裝android應用程序開發環境與windows類似,依次安裝好以下軟體即可:
(1)eclipse
(2)adt
(3)androidsdk
與windows下安裝唯一不同的一點是,下載這些軟體的時候要下載linux版本的安裝包。
安裝好以上android應用程序的開發環境後,還可以選擇是否需要配置emulator和adb工具的環境變數,以方便在進行jni開發的時候使用。配置步驟如下:
把emulator所在目錄android-sdk-linux/tools以及adb所在目錄android-sdk-linux/platform-tools添加到環境變數中,android-sdk-linux指androidsdk安裝包android-sdk_rxx-linux的解壓目錄。
[plain] view plainprint?
01.$sudo vim /etc/profile
02.exportpath=~/software/android/android-sdk-linux/tools:$path
03. exportpath=~/software/android/android-sdk-linux/platform-tools:$path
$sudo vim /etc/profile
exportpath=~/software/android/android-sdk-linux/tools:$path
exportpath=~/software/android/android-sdk-linux/platform-tools:$path
編輯完畢後退出,並重啟生效。

2.3.安裝ndk
ndk是由android提供的編譯android本地代碼的一個工具。
(1)從androidndk官網http://developer.android.com/sdk/ndk/index.html下載ndk,目前最新版本為android-ndk-r6b-linux-x86.tar.bz2.
(2)解壓ndk到工作目錄:
[plain] view plainprint?
01.$tar -xvf android-ndk-r6b-linux-x86.tar.bz2
02.$sudo mv android-ndk-r6b /usr/local/ndk
$tar -xvf android-ndk-r6b-linux-x86.tar.bz2
$sudo mv android-ndk-r6b /usr/local/ndk
(3)設置ndk環境變數

[plain] view plainprint?
01.$sudo vim /etc/profile
02.exportpath=/usr/local/ndk:$path
$sudo vim /etc/profile
exportpath=/usr/local/ndk:$path

編輯完畢後保存退出,並重啟生效

(4)驗證安裝

[plain] view plainprint?
01.$ cd/usr/local/ndk/samples/hello-jni/
02.$ ndk-build
03.gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
04.gdbsetup : libs/armeabi/gdb.setup
05.install : libhello-jni.so => libs/armeabi/libhello-jni.so
$ cd/usr/local/ndk/samples/hello-jni/
$ ndk-build
gdbserver : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
gdbsetup : libs/armeabi/gdb.setup
install : libhello-jni.so => libs/armeabi/libhello-jni.so

3.jni實現
我們需要定義一個符合jni介面規范的c/c 介面,這個介面不用太復雜,例如輸出一個字元串。接下來,則需要把c/c 介面的代碼文件編譯成共享庫(動態庫).so文件,並放到模擬器的相關目錄下。最後,啟動java應用程序,就可以看到最終效果了。

3.1.編寫java應用程序代碼
(1)啟動eclipse,新建android工程

project:jnitest

package:org.tonny.jni

activity:jnitest

(2)編輯資源文件

編輯res/values/strings.xml文件如下:編輯res/layout/main.xml文件
我們在主界面上添加了一個edittext控制項和一個button控制項。

(3)編輯jnitest.java文件


static表示在系統第一次載入類的時候,先執行這一段代碼,在這里表示載入動態庫libjnitest.so文件。

再看這一段:

[java] view plainprint?
01.privatenativestring getreply();
privatenativestring getreply();
native表示這個方法由本地代碼定義,需要通過jni介面調用本地c/c 代碼。

[java] view plainprint?
01.publicvoidonclick(view arg0) {
02.edtname.settext(reply);
03.}
publicvoidonclick(view arg0) {
edtname.settext(reply);
}

這段代碼表示點擊按鈕後,把native方法的返回的字元串顯示到edittext控制項。

(4)編譯工程,生成.class文件。

3.2.用javah工具生成符合jni規范的c語言頭文件

在終端中,進入android工程所在的bin目錄

[plain] view plainprint?
01.$cd ~/project/android/jnitest/bin
$cd ~/project/android/jnitest/bin
我們用ls命令查看,可以看到bin目錄下有個classes目錄,其目錄結構為classes/org/tonny/jni,即classes的子目錄結構是android工程的包名org.tonny.jni。請注意,下面我們准備執行javah命令的時候,必須進入到org/tonny/jni的上級目錄,即classes目錄,否則javah會提示找不到相關的java類。

下面繼續:

[plain] view plainprint?
01.$cd classes
02.$javah org.tonny.jni.jnitest
03.$ls
04.org org_tonny_jni_jnitest.h
$cd classes
$javah org.tonny.jni.jnitest
$ls
org org_tonny_jni_jnitest.h

執行javahorg.tonny.jni.jnitest命令,在classes目錄下會生成org_tonny_jni_jnitest.h頭文件。如果不進入到classes目錄下的話,也可以這樣:

[plain] view plainprint?
01.$javah -classpath ~/project/android/jnitest/bin/classesorg.tonny.jni.jnitest
$javah -classpath ~/project/android/jnitest/bin/classesorg.tonny.jni.jnitest
-classpath 參數表示裝載類的目錄。

3.3.編寫c/c 代碼
生成org_tonny_jni_jnitest.h頭文件後,我們就可以編寫相應的函數代碼了。下面在android工程目錄下新建jni目錄,即~/project/android/jnitest/jni,把org_tonny_jni_jnitest.h頭文件拷貝到jni目錄下,並在jni目錄下新建org_tonny_jni_jnitest.c文件,編輯代碼如下:

[cpp] view plainprint?
01.#include
02.#include
03.#include"org_tonny_jni_jnitest.h"
04.
05.
06.jniexportjstring jnicalljava_org_tonny_jni_jnitest_getreply
07.(jnienv *env, jobject obj){
08.return(*env)->newstringutf(env,(char*)"hello,jnitest");
09.}
#include
#include
#include"org_tonny_jni_jnitest.h"

jniexportjstring jnicalljava_org_tonny_jni_jnitest_getreply
(jnienv *env, jobject obj){
return(*env)->newstringutf(env,(char*)"hello,jnitest");
}

我們可以看到,該函數的實現相當簡單,返回一個字元串為:"hello,jnitest"

3.4.編寫android.mk文件
在~/project/android/jnitest/jni目錄下新建android.mk文件,android可以根據這個文件的編譯參數編譯模塊。編輯android.mk文件如下:

[plain] view plainprint?
01.local_path:= $(call my-dir)
02.include$(clear_vars)
03.local_module := libjnitest
04.local_src_files:= org_tonny_jni_jnitest.c
05.include$(build_shared_library)
local_path:= $(call my-dir)
include$(clear_vars)
local_module := libjnitest
local_src_files:= org_tonny_jni_jnitest.c
include$(build_shared_library)

local_module表示編譯的動態庫名稱

local_src_files 表示源代碼文件

3.5.用ndk工具編譯並生成.so文件
進入到jnitest的工程目錄,執行ndk-build命令即可生成libjnitest.so文件。

[plain] view plainprint?
01.$cd ~/project/android/jnitest/
02.$ndk-build
03.invalidattribute name:
04.package
05.install : libjnitest.so => libs/armeabi/libjnitest.so
$cd ~/project/android/jnitest/
$ndk-build
invalidattribute name:
package
install : libjnitest.so => libs/armeabi/libjnitest.so
可以看到,在工程目錄的libs/armeabi目錄下生成了libjnitest.so文件。

3.6.在模擬器上運行
(1)首先,我們把android模擬器啟動起來。進入到emulator所在目錄,執行emulator命令:

[plain] view plainprint?
01.$cd ~/software/android/android-sdk-linux/tools
02.$./emulator @avd-2.3.3-v10 -partition-size 512
$cd ~/software/android/android-sdk-linux/tools
$./emulator @avd-2.3.3-v10 -partition-size 512
avd-2.3.3-v10表示你的模擬器名稱,與在eclipse->avdmanager下的avdname對應,-partition-size表示模擬器的存儲設備容量。

(2)接下來,我們需要把libjnitest.so文件拷貝到模擬器的/system/lib目錄下,執行以下命令:

[plain] view plainprint?
01.$cd ~/project/android/jnitest/libs/armeabi/
02.$adb remount
03.$adb push libjnitest.so /system/lib
04.80 kb/s (10084 bytes in 0.121s)
$cd ~/project/android/jnitest/libs/armeabi/
$adb remount
$adb push libjnitest.so /system/lib
80 kb/s (10084 bytes in 0.121s)

當在終端上看到有80 kb/s (10084 bytes in 0.121s)傳輸速度等信息的時候,說明拷貝成功。

(3)在終端上執行jnitest程序,這個我們可以在eclipse下,右鍵點擊jnitest工程,runas->android application,即可在模擬器上啟動程序

熱點內容
matlab命令窗口和新建腳本 發布:2024-07-17 15:51:26 瀏覽:374
建ftp文件夾 發布:2024-07-17 15:51:26 瀏覽:954
魔獸撿物腳本 發布:2024-07-17 15:27:56 瀏覽:129
開發ip伺服器 發布:2024-07-17 15:24:42 瀏覽:387
安卓系統視頻製作哪個好用 發布:2024-07-17 15:10:47 瀏覽:210
androidapk結構 發布:2024-07-17 15:10:43 瀏覽:945
c語言指針的例子 發布:2024-07-17 15:08:01 瀏覽:768
linuxzcat 發布:2024-07-17 15:02:09 瀏覽:901
賓士編程嗎 發布:2024-07-17 14:57:08 瀏覽:853
硬碟加密硬體 發布:2024-07-17 14:51:05 瀏覽:836
网站地图