當前位置:首頁 » 安卓系統 » 安卓程序運行時會使用哪個函數

安卓程序運行時會使用哪個函數

發布時間: 2022-08-08 18:44:58

A. 安卓開發什麼時候使用jni

android JNI是連接android java部分和C/C++部分的紐帶,完整使用JNI需要Java代碼和C/C++代碼。其中C/C++代碼用於生成庫文件,Java代碼用於引用C /C++庫文件以及調用C/C++方法。

android Java部分代碼:

jnitest.java
02
03packagecom.hello.jnitest;
04
05
06
07importandroid.app.Activity;
08
09importandroid.os.Bundle;
10
11
12
{
14
15/**.*/
16
[email protected]
18
19publicvoidonCreate(BundlesavedInstanceState){
20
21super.onCreate(savedInstanceState);
22
23setContentView(R.layout.main);
24
25Naddtest=newNadd();
26
27setTitle("TheNativeAddResultis"+String.valueOf(test.nadd(10,20)));
28
29}
30
31}
32
33Nadd.java
34
35packagecom.hello.jnitest;
36
37
38
39publicclassNadd{
40
41static{
42
43System.loadLibrary("hello_jni");
44
45}
46
47
48
49publicnativeintnadd(inta,intb);
50
51}

Java代碼說明:

1)jnitest.java是一個activity的類對象,在該類對象中生成調用JNI函數的類對象,同時調用JNI方法,最後將JNI方法的結果顯示到標題欄上;

2)Nadd.java是一個引用和聲明JNI庫和函數的類,其中System.loadLibrary();函數用來引用JNI庫,默認JNI庫放在 android系統的/system/lib/目錄下;public nadd int nadd(int a, int b);為聲明需要在java程序中使用的JNI庫中的函數;

JNI中java部分的代碼到此就結束了,總結一下在java代碼中需要做兩件事:

1)使用System.loadLibrary()函數來引用JNI庫;

2)聲明調用JNI庫的函數且前面添加native關鍵字;


android C/C++部分代碼:

01#defineLOG_TAG"hello-JNI"
02#include<stdio.h>
03#include<stdlib.h>
04#include<unistd.h>
05#include<sys/types.h>
06#include<sys/stat.h>
07#include<fcntl.h>
08#include<assert.h>
09#include"jni.h"
10#include"JNIHelp.h"
11#include"android_runtime/AndroidRuntime.h"
12staticjintcom_hello_jnitest_jnitest_nadd(JNIEnv*env,jobjectobj,jinta,jintb)
13{
14return(a*b);
15}
[]={
17{"nadd","(II)I",(void*)com_hello_jnitest_jnitest_nadd},
18};
19staticintregister_android_test_hello(JNIEnv*env)
20{
21returnandroid::AndroidRuntime::registerNativeMethods(env,"com/hello/jnitest/Nadd",gMethods,NELEM(gMethods));
22}
23jintJNI_OnLoad(JavaVM*vm,void*reserved)
24{
25JNIEnv*env=NULL;
26if(vm->GetEnv((void**)&env,JNI_VERSION_1_4)!=JNI_OK){
27printf("ErrorGetEnv ");
28return-1;
29}
30assert(env!=NULL);
31if(register_android_test_hello(env)<0){
32printf("register_android_test_helloerror. ");
33return-1;
34}
35returnJNI_VERSION_1_4;
36}

JNI C/C++代碼說明:

1)JNI_OnLoad()函數。該函數在Java程序調用System.loadLibrary()時,被調用執行,用於向JavaVM注冊JNI函數等。在本例中首先通過參數JavaVM(Java虛擬機指針)獲取當前應用程序所在的線程,即:JNIEnv。再通過調用 android::AndroidRuntime::registerNativeMethods()注冊native實現的函數指針。

2)JNI函數和Java調用函數的映射關系。使用JNINativeMethod將java調用的函數名與JNI實現的函數名聯系在一起;

3)JNI函數實現;


Android.mk代碼:

1LOCAL_PATH:=$(callmy-dir)
2include$(CLEAR_VARS)
3LOCAL_PRELINK_MODULE:=false
4LOCAL_SRC_FILES:=
5com_hello_jnitest.cpp
6LOCAL_SHARED_LIBRARIES:=
7libandroid_runtime
8LOCAL_MODULE:=libhello_jni
9include$(BUILD_SHARED_LIBRARY)

需要注意的是:

1)JNI C/C++部分的代碼需要在android源代碼樹上進行編譯,編譯完成後我的做法是直接將生成的.so通過adb push方法上傳到android虛擬機的/system/lib/目錄下;

2)java代碼可以在eclipse下直接編譯且在虛擬機上執行;


編譯JNI C/C++部分代碼(在android內核源代碼根目錄下):

#make libhello_jni

之後在out/target/proct/generic/system/lib/目錄下生成libhello_jni.so


上傳libhello_jni.so到android虛擬機:

#adb push out/target/proct/generic/system/lib/libhello_jni.so /system/lib

注意:此時有可能出現Out of Memory的錯誤提示。當出現如上錯誤提示時,需要使用#adb remount重新載入一下就可以了。

另外,也有可能直接使用eclipse啟動android虛擬機時出現上述錯誤且使用#adb remount也出現的情況,此時需要手動啟動android虛擬機,如:#emulator -avd xxx -partition-size 128,之後在使用#adb push就可以了。

B. Android程序如何調用C下寫的函數

你說的太多了,在這里很難說清楚。你說的opencv對Android的介面是javaCV吧,這個已經完全封裝了Opencv 並且提供了硬體加速,簡單處理的話,如果你不用這個有點可惜。
直接調用c的的話就是JNI不過需要在Linux環境下開發,編譯.so。
那麼java要做的就是把圖像傳給c,c處理完,在傳回來顯示。至於如何傳遞,我沒有研究過。如果控制圖像大小通過流還是可以的。如果像素高,圖片大 你就要在考慮考慮了

C. 安卓ui方面活動跳轉用什麼函數

android程序一般不會只有一個activity,會碰到activity之間的跳轉。以下是使用Intent做應用程序內部的activity做跳轉。

比如,應用程序第一個activity是:

這需要寫兩個Activity類。第一個是:MainActivity

package com.easymorse;


import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;


public class MainActivity extends Activity {


private Button button;


/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);


this.button = (Button) this.findViewById(R.id.Button01);

this.button.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Intent intent = new Intent();

intent.setClass(MainActivity.this, NextActivity.class);

startActivity(intent);

}

});

}

}


第二個是:NextActivity

package com.easymorse;


import android.app.Activity;

import android.os.Bundle;


public class NextActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.setContentView(R.layout.next_activity);

}

}


然後,要在AndroidManifest.xml中增加這兩個Activity的聲明。在string.xml中增加常量字元串:

<?xml version=」1.0″ encoding=」utf-8″?>

<resources>

<string name=」hello」>Hello World, MainActivity!</string>

<string name=」app_name」>activity.forward.demo</string>

<string name=」next_button」>下一步</string>

</resources>


layout目錄下創建NextActivity的布局文件聲明,比如next_activity.xml:

<?xml version=」1.0″ encoding=」utf-8″?>

<LinearLayout

xmlns:android=」http://schemas.android.com/apk/res/android」

android:layout_width=」wrap_content」

android:layout_height=」wrap_content」>

<TextView android:text=」@string/next_button」 android:id=」@+id/TextView01″ android:layout_width=」wrap_content」 android:layout_height=」wrap_content」></TextView>

</LinearLayout>


這種情況下,如果按回退鍵將回到MainActivity。如果不希望回退到前一個activity,而是退出。需要這樣:

this.button.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

Intent intent = new Intent();

intent.setClass(MainActivity.this, NextActivity.class);

startActivity(intent);

finish();

D. android中的context函數是起什麼作用的為什麼在每次遇到contex()函數的時候都可以用this這個指針代替,

Context不是函數而是一個類——如果不太了解面向對象,可以把「類」看做一種數據類型,就像int,不過類型為「類」的數據(稱為對象)可能儲存遠比int多的信息,比如這里的類型為Context的對象就儲存關於程序、窗口的一些資源。

有些函數調用時需要一個Context參數,比如Toast.makeText,因為函數需要知道是在哪個界面中顯示的Toast。
再比如,Button myButton = new Button(this); 這里也需要Context參數(this),表示這個按鈕是在「this」這個屏幕中顯示的。
Android開發使用(純粹的)面向對象語言,一切都是對象,就連我們寫的函數都是對象的函數。
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this,
"OK!",
Toast.LENGTH_LONG).show();
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v)
{
Toast.makeText(MainActivity.this,
"Hello, world!",
Toast.LENGTH_LONG).show();
}
});
}
}
這里OnCreate就是MainActivity的對象的函數(MainActivity是類),所以這個函數中的this就表示當前的、包含這個函數的MainActivity對象。
MainActivity extends Activity,意思是MainActivity 繼承 Activity,即MainActivity 是 Activity 的一種,所有的MainActivity 都是 Activity。同樣,在Android文檔中Activity繼承ContextThemeWrapper,ContextThemeWrapper繼承ContextWrapper,ContextWrapper繼承Context。所以this這個MainActivity也是Context,把this傳入Toast.makeText表示「OK!」是在當前的MainActivity對象(也是Context)中顯示的。
對於顯示"Hello, world!"的Toast.makeText,這個函數在onClick中,而onClick是new Button.OnClickListener(){...}這個沒有名字的類的函數,this表示匿名類的對象,不表示MainActivity對象,所以這里用MainActivity.this,強制選擇外面一層MainActivity的this。
PS:定向求助?我不記得我以前回答過Android方面的問題……難道是系統自動發的?

E. 安卓應用怎麼運行的java中是先運行main函數,安卓中是先運行哪個函數別說運行在虛擬機裡面,

這個要看工程里的AndroidManifest.xml文件,這里有注冊各種activity,而哪個註明了

<actionandroid:name="android.intent.action.MAIN"/>

就代表先啟動這個activity, 後面也有標志MAIN , 可以想成與java的main函數類似


例子如下:

<activity
android:name=".SettingsActivity"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

(這個SettingsActivity會首先啟動,下面的<category android:name="android.intent.category.LAUNCHER" /> 代表安裝完之後 軟體自動啟動,若沒有這句話,軟體安裝完不會自動啟動,要你自己去點擊)

F. 在android開發中,當按下手機上的返回鍵時,會執行哪一個函數,是不是ondestroy

不是
響應的是onkeydown函數
你還是買本書從頭學吧
我也是自己學的

G. Android程序可以調用C函數嗎 我需要使用C訪問Android底層,然後希望Android程序調用C程序。

在一些Android應用的開發中,需要通過JNI和 Android NDK工具實現JAVA和C/C++之間的相互調用。
Java Native Interface (JNI)標準是java平台的一部分,它允許Java代碼和其他語言寫的代碼進行交互。JNI是本地編程介面,它使得在 Java 虛擬機 (VM)內部運行的 Java代碼能夠與用其它編程語言(如 C、C++和匯編語言)編寫的應用程序和庫進行交互操作。
NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,並能自動將so和java應用一起打包成apk。這些工具對開發者的幫助是巨大的。NDK集成了交叉編譯器,並提供了相應的mk文件隔離CPU、平台、ABI等差異,開發人員只需要簡單修改mk文件(指出「哪些文件需要編譯」、「編譯特性要求」等),就可以創建出so。NDK可以自動地將so和Java應用一起打包,極大地減輕了開發人員的打包工作。

熱點內容
sql語句創建學生表 發布:2022-09-27 02:44:51 瀏覽:656
燈識別演算法 發布:2022-09-27 02:39:14 瀏覽:946
linux是gcc編譯的嗎 發布:2022-09-27 02:38:51 瀏覽:553
安卓刪除緩存的圖片 發布:2022-09-27 02:34:07 瀏覽:468
stm32資料庫 發布:2022-09-27 02:29:49 瀏覽:417
愛設計網上傳 發布:2022-09-27 02:27:08 瀏覽:885
tps壓縮包 發布:2022-09-27 02:26:51 瀏覽:946
ios編程實戰pdf 發布:2022-09-27 02:25:19 瀏覽:631
黑莓如何關閉設備密碼 發布:2022-09-27 02:23:28 瀏覽:280
如何查看別人蹭你家網安卓 發布:2022-09-27 02:21:14 瀏覽:466