当前位置:首页 » 安卓系统 » 安卓程序运行时会使用哪个函数

安卓程序运行时会使用哪个函数

发布时间: 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
17@Override
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应用一起打包,极大地减轻了开发人员的打包工作。

热点内容
安卓系统的用户管理在哪里 发布:2024-05-04 23:12:27 浏览:428
我的世界服务器推荐电脑版免费 发布:2024-05-04 23:04:46 浏览:394
c程序如何编译 发布:2024-05-04 22:58:05 浏览:931
苹果手机怎么查看id密码 发布:2024-05-04 22:54:49 浏览:657
家有三相电如何配置音响设备 发布:2024-05-04 22:53:42 浏览:55
三星存储器已几乎满 发布:2024-05-04 22:47:38 浏览:736
mf90pos机密码是什么 发布:2024-05-04 22:24:04 浏览:750
编译预处理和函数区别 发布:2024-05-04 22:16:49 浏览:431
java复选框 发布:2024-05-04 22:13:24 浏览:529
安卓怎么玩页游 发布:2024-05-04 22:03:17 浏览:142