android 主线程栈native代表什么意思

android 主线程栈native代表什么意思,第1张

调用栈的作用, 栈可以记录你运行中的函数调用(或者叫做函数执行顺序), 每个线程都有一个独自的调用栈, 至于为什么, 你可以想一下, 如果线程和调用它的进程共用调用栈的话, 线程还能并行进行么 调用栈记录了运行顺序, 开创独立的栈的原因就是为了并行进行 这就是线程最重要的作用

第一步:

在自己项目中创建一个包含native的方法类HelloWorldjava -->包名comningsoningsodemo

public class HelloWorld {

public native String sayHello(String name); // 1声明这是一个native函数,由本地代码实现

static {

SystemloadLibrary("hello"); // 2加载实现了native函数的动态库,只需要写动态库的名字

}

}

第二步:

在终端执行javac命令将java源文件编译成class字节码文件

执行javac命令

-d 表示将编译后的class文件放到指定的文件夹下面

结果图:

编译后的字节码文件

以上也可以直接执行/gradlew build 不过文件就要自己去找了,该class在你的/app/build/intermediates/classes/debug文件夹对应的包名下

第三步:

继续在终端执行javah -jni命令 根据class文件生产h头文件

Paste_Imagepng

注意:-d和-o只能使用其中一个参数。

参数说明:classpath:类搜索路径,这里表示从当前的 bin 目录下查找

-d:将生成的头文件放到当前的 jni 目录下

-o: 指定生成的头文件名称,默认以类全路径名生成(包名+类名h)

结果图:

对应的两条命令生产的h文件,位置不同,名称不同而已。但是内容一样

Helloh内容:

/ DO NOT EDIT THIS FILE - it is machine generated

/#include <jnih>

/ Header for class com_ningso_ningsodemo_HelloWorld /

#ifndef _Included_com_ningso_ningsodemo_HelloWorld

#define _Included_com_ningso_ningsodemo_HelloWorld

#ifdef __cplusplus

extern "C" {

#endif

/ Class: com_ningso_ningsodemo_HelloWorld

Method: sayHello

Signature: (Ljava/lang/String;)Ljava/lang/String;

/

JNIEXPORT jstring JNICALL Java_com_ningso_ningsodemo_HelloWorld_sayHello

(JNIEnv , jobject, jstring);

#ifdef __cplusplus}

#endif

#endif

第四步:

在main目录下新建一个jin文件夹将h文件拖至此目录下并在这做如下 *** 作:

实现h中的函数

JAVA中的native是什么?

native主要用于方法上

1、一个native方法就是一个Java调用非Java代码的接口。一个native方法是指该方法的实现由非Java语言实现,比如用C或C++实现。

2、在定义一个native方法时,并不提供实现体(比较像定义一个Java Interface),因为其实现体是由非Java语言在外面实现的。

native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对 *** 作系统底层进行访问和 *** 作,但是可以通过JNI接口调用其他语言来实现对底层的访问。

JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码。

不过,对Java外部的调用通常不能移植到其他平台,在applet中还可能引发安全异常。实现本地代码将使您的Java应用程序无法通过100%纯Java测试。但是,如果必须执行本地调用,则要考虑几个准则:

1将您的所有本地方法都封装到一个类中,这个类调用单个的DLL。对每一种目标 *** 作系统平台,都可以用特定于适当平台的版本的DLL。这样可以将本地代码的影响减少到最小,并有助于将以后所需要的移植问题考虑在内。

2本地方法尽量简单。尽量使您的本地方法对第三方(包括Microsoft)运行时DLL的依赖减少到最小。使您的本地方法尽量独立,以将加载您的DLL和应用程序所需的开销减少到最小。如果需要运行时DLL,必须随应用程序一起提供。

JNI的书写步骤如下:

a编写带有native声明的方法的Java类

b使用javac命令编译编写的Java类

c使用java -jni 来生成后缀名为h的头文件

d使用其他语言(C、C++)实现本地方法

e将本地方法编写的文件生成动态链接库

以下是一个在Java中调用本地C程序的简单的例子:

a编写HelloWorldjava类

class HelloWorld {

public native void hello();

static {

SystemloadLibrary("hello");

}

public static void main(String[] args) {

new HelloWorld()hello();

}

}

b编译

javac HelloWorldjava

c生成h文件

javah -jni HelloWorld

生成内容如下:

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

include <jnih>

/ Header for class HelloWorld /

#ifndef _Included_HelloWorld

#define _Included_HelloWorld

#ifdef __cplusplus

extern "C" {#

endif

/

Class: HelloWorld

Method: hello

Signature: ()V

/

JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv , jobject);#

ifdef __cplusplus

}#

endif# endif

第一个参数是调用JNI方法时使用的JNI Environment指针。第二个参数是指向在此Java代码中实例化的Java对象HelloWorld的一个句柄。其他参数是方法本身的参数

dc实现

#include < jnih >

#include "HelloWorldh"

#include < stdioh >

JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv env, jobject obj) {

printf("Hello World!\n");

return;

}

其中,第一行是将jnih文件引入(在%JAVA_HOME%\include目录下),里边有JNIEnv和jobject的定义。

e编译c实现

这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImplc文件夹下面,使用VC的编译器cl成。

cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImpc -Fehellodll

注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorldjava文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%\include -I%java_home%\include\win32参数加上,因为在第四步里面编写本地方法的时候引入了jnih文件。

6) 运行程序

java HelloWorld 就ok了!

文章知识点与官方知识档案匹配

Java技能树首页概览

91537 人正在系统学习中

打开CSDN APP,看更多技术内容

Java当中native方法的详解_先苦后甜似淡非定的博客_native方法

一、认识 native 即 JNI,Java Native Interface 凡是一种语言,都希望是纯。比如解决某一个方案都喜欢就单单这个语言来写即可。Java平台有个用户和本地C代码进行互 *** 作的API,称为Java Native Interface (Java本地接口)。 回到顶部 二

继续访问

JAVA中的native是什么有什么用_Rsun04551的博客_java中native

1、一个native方法就是一个Java调用非Java代码的接口。一个native方法是指该方法的实现由非Java语言实现,比如用C或C++实现 2、在定义一个native方法时,并不提供实现体(比较像定义一个Java Interface),因为其实现体是由非Java语言在外面

继续访问

基础Java的native方法作用和意义

Java的native方法作用和意义

继续访问

最新发布 Java关键字之native详解

native 用来修饰方法,用 native 声明的方法表示告知 JVM 调用,该方法在外部定义,我们可以用任何语言去实现它。简单地讲,一个native Method就是一个 Java 调用非 Java 代码的接口。

继续访问

java之native关键字详细解析_码农研究僧的博客

publicnativeStringintern(); 1 1 概念 深究其native这个关键字 其主要表现为 只要有一个native方法,内部结构是Java调用非Java代码接口 所谓的非java代码,主要是指c或者c++实现,可以不深究其代码实现,只需要会调用即可

继续访问

java中的Native方法_消逝者的博客_java native方法

一 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在

继续访问

Java中的native方法

原文链接:java中的native方法 Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到 *** 作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。 可以将native方法比作Java程序同C程序的接口,其实现步骤: 1、在Java中声明native()方法,然后编译。 2、用javah产生一个

继续访问

JNI使用及简单封装

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、Java调用C++二、使用步骤1引入库2读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 本文主要记录JNI实践中的使用场景,Java调用C++ ,C++回调Java的实现过程,带简单封装思路。 提示:以下是本篇文章正文内容,下面案例可供参考 一、Java调用C++ ##1, 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1引入库 代码如下(示

继续访问

java中native方法实现_详解Java中native方法的使用_勤婧知浩的博客-C

今天在网上学习时碰到有关于native修饰符所修饰的方法,上网查了查,觉得很有意思记录一下 1、native简介 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言

继续访问

java native方法_深入理解Java虚拟机_weixin_39557087的博客-CSDN

native方法就是非Java的方法,比如可能是C 实现的,在字节码文件中并不会体现,所以native方法的计数器值是空的。比如SystemcurrentTimeMillis();方法就是一个native方法,声明如下: publicstaticnativelongcurrentTimeMillis();

继续访问

java的native_Java关键字(二)——native

本篇博客我们将介绍Java中的一个关键字——native。native 关键字在 JDK 源码中很多类中都有,在 Objectjava类中,其 getClass() 方法、hashCode()方法、clone() 方法等等都是用 native 关键字修饰的。public final native Class> getClass();public native int hashCode();

继续访问

Java native方法详解

一 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。 "A native method

继续访问

java中的native是什么

native主要用于方法上 一个native方法就是一个Java调用非Java代码的接口。一个native方法是指该方法的实现由非Java语言实现,比如用C或C++实现。

crodova直接调用android原生方法的时候要了解一些东西,你可以看下!我发你看下,

一.总体结构

Cordova的目标是用HTML,JS,来完成手机客户端的开发,并且是只开发一次可以在各种手机平台上跑,所以理想状态是用JS去控制所有事件。Cordova基于WebView组件。每个继承自DroidGap的Activity对应一个独立的CordovaWebView。Cordova提供了一些列的JS接口来访问Android的native。以插件(Plugin)的形式提供自定义接口给JS端访问。

二.一些疑问

1 Cordova框架是如何启动的?

2 插件是怎么回事?如何工作的。

3 Cordova的官方文档都是说JS如何访问Android的native,那么在Android的native中是否可以访问JS的函数?如何访问?

三.结构解剖

1.Cordova的启动

1) 如何启动

Cordova提供了一个Class(DroidGap)和一个interface(CordovaInterface)来让Android开发者开发Cordova。一般情况下实现DroidGap即可,因为DroidGap类已经做了很多准备工作,可以说DroidGap类是Cordova框架的一个重要部分;如果在必要的情况下实现CordovaInterface接口,那么这个类中很多DroidGap的功能需要自己去实现。

继承了DroidGap或者CordovaInterface的Activity就是一个独立的Cordova模块,独立的Cordova模块指的是每个实现了DroidGap或者CordovaInterface接口的Activity都对应一套独立的WebView,Plugin,PluginManager,没有共享的。(我觉得这样是很不爽的,没有共享,如果plugin和Activity很多的情况下这样是相当的耗资源)

当在实现了DroidGap或者CordovaInterface接口的Activity的onCreate方法中调用DroidGap的loadUrl方法即启动了Cordova框架。

2)启动过程

public class A extends DroidGap{}

a 在A的onCreate方法中首先调用super onCreate()

这一步中创建了一个LinearLayout(LinearLayoutSoftKeyboardDetectclass)布局,以及计算这个Layout的大小及显示的一些方式。在后面的过程中会将一个WebView加到这个LinearLayout中。

b 再次调用DroidGap 的loadUrl()方法

DroidGap loadUrl()中首先判断A的CordovaWebView是否实例化,如果没有回实例化一个CordovaWebView对象并将该对象添加到父LinearLayout中去,同时将该LinearLayout添加的ContentView。见以下代码:

public void onCreate(Bundle savedInstanceState) {

root = new LinearLayoutSoftKeyboardDetect(this, width, height);

}

public void init() {

CordovaWebView webView = new CordovaWebView(DroidGapthis);

thisinit(webView,

new CordovaWebViewClient(this, webView),

new CordovaChromeClient(this, webView));

}

public void init(CordovaWebView webView, CordovaWebViewClient webViewClient, CordovaChromeClient webChromeClient) {

thisappView = webView;

thisappViewsetId(100);

thisrootaddView(thisappView);

setContentView(thisroot);

}

public void loadUrl(String url) {

if (thisappView == null) {

thisinit();

}

}

这样就完成了我们在一般开发中使用的模式:

public void onCreate(Bundle savedInstanceState) {

super onCreate(Bundle savedInstanceState);

setContentView(resID);

}

在初始化完CordovaWebView后调用CordovaWebViewloadUrl()。此时完成Cordova的启动。

c 在实例化CordovaWebView的时候, CordovaWebView对象会去创建一个属于当前CordovaWebView对象的插件管理器PluginManager对象,一个消息队列NativeToJsMessageQueue对象,一个JavascriptInterface对象ExposedJsApi,并将ExposedJsApi对象添加到CordovaWebView中,JavascriptInterface名字为:_cordovaNative。

d Cordova的JavascriptInterface

在创建ExposedJsApi时需要CordovaWebView的PluginManager对象和NativeToJsMessageQueue对象。因为所有的JS端与Android native代码交互都是通过ExposedJsApi对象的exec方法。

在exec方法中执行PluginManager的exec方法,PluginManager去查找具体的Plugin并实例化然后再执行Plugin的execute方法,并根据同步标识判断是同步返回给JS消息还是异步。由NativeToJsMessageQueue统一管理返回给JS的消息。

e 何时加载Plugin,如何加载

Cordova在启动每个Activity的时候都会将配置文件中的所有plugin加载到PluginManager。那么是什么时候将这些plugin加载到PluginManager的呢?

在b中说了最后会调用CordovaWebViewloadUrl(),对,就在这个时候会去初始化PluginManager并加载plugin。PluginManager在加载plugin的时候并不是马上实例化plugin对象,而是只是将plugin的Class名字保存到一个hashmap中,用service名字作为key值。

当JS端通过JavascriptInterface接口的ExposedJsApi对象请求Android时,PluginManager会从hashmap中查找到plugin,如果该plugin还未实例化,利用java反射机制实例化该plugin,并执行plugin的execute方法。

2.Cordova插件

在『1』中已经接触了些Cordova插件的东西,这里总结下Cordova的插件

Cordova插件只是一个普通的java类,没有什么特殊之处。插件中的execute方法只是Cordova框架的一个规定。

Cordova为了方便于插件的管理,所以引进了一个PluginManager来管理插件。在ExposedJsApi中,PluginManager起一个代理作用。

在原生态的WebView开发中,我们可以给WebView添加一个JavascriptInterface对象来使JS可以访问android的代码;在Cordova也有一个这样的对象ExposedJsApi。

在ExposedJsApi中,它将请求转发给我们的PluginManager,这个时候PluginManager会根据给的service的名字来查找具体的Plugin并执行。

所以,我认为Cordova插件是android端的API,提供给JS。

在Cordova虽然有JavascriptInterface对象ExposedJsApi,但在JS端并不是真正通过android提供的windowJavascriptInterfacerequest这种方式来请求。在JS端,Cordova是通过JS的prompt()函数触发ChromeClient中的onJsPrompt方法,通过onJsPrompt去获取到请求,再将请求转发给ExposedJsApi。

注:在Cordova中,Java端和JavaScript端都准备了代码来使用特殊URL('>

以上就是关于android 主线程栈native代表什么意思全部的内容,包括:android 主线程栈native代表什么意思、Android Studio怎么用JNI编写出Hello World、什么是native输出等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10134020.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存