android aar文件怎么使用

就将此组件提供的各个本地函数(Native Function)登记到VM里,以便能加快后续呼叫本地函数的效率。

aar

libs是什么文件夹 文件夹是什么libs是什么文件夹 文件夹是什么


libs是什么文件夹 文件夹是什么


`-- libmyjni.so

何为aar?大家都知道jar文件把,如果你有一个Android Library项目,可以很容易的导出jar文件,然后在其他项目中很方便的引用,aar和jar类似,区别就是一个Android Library项目导出的jar文件不能包含资源文件,比如一些drawable文件、xml资源文件之类的,所以这就有很大的限制,在gradle之前我们要引用带资源文件的Android Library必须要把整个library导入进来进行引用,但是有了gradle之后,Android Library项目可以直接导出成aar,然后其他项目像引用jar的方式直接方便的引用。

导出aar

首先Android Library项目的gradle脚本只需要在开头声明

代码代码如下:

apply plugin: 'com.android.library'

之后就和导出apk文件一样的方法,执行 ./gradlew assembleRelease,然后就可以在 build/outputs/aar 文件夹里生成aar文件

引用本地的aar

生成aar之后下一步就是如何引用本地的aar文件?本#05 pc 000505b9 //lib/libm.so地的aar文件并没有像引用jar文件这么简单,也没有提供解决方案。好在国外的一些前辈总结出了方法,下面就以test.aar文件为例来详述下方法

1、把aar文件放在一个文件目录内,比如就放在libs目录内

2、在app的build.gradle文件添加如下内容

代码代码如下:

flatDir

dirs 'libs' //this way we can find the .aar file in libs folder }

代码代码如下:

dependencies

compile(name:'test', ext:'aar')

总结

当然通过gradle最普遍的方法是把aar上传到menCentral或者jcenter,引用的话更方便,但是对于一些公司内部library不想公开,而传统的引用library方式又太繁琐,引用本地的aar文件这种方式会非常方便合适,之后通用的模块只需要做成library,不管更新还是修改只需要打包成aar,然后供其他项目使用就好了,对Android开发来说这是提升代码复用非常有效的一个手段。

Linux下编译openssl后的.so文件被放在哪个目录下边了?具体是哪个目录啊?

Adb push libNadd.so //lib

不进行make install安装的话,就在你openssl的源码目录里,当然你config的时候需要指明shared,否则只有.a的,没有.so的。

如果config的时候,指定了prefix,那么就到你指定6.在eclipsh中创建android application。将myjni中自动生成的libs文件夹拷贝到当前工程文件夹中,编译运行即可。的目录去找,下面应该有个lib目录。

如果你的linux自带openssl的话,系统的lib目录下就有。方法/步骤libcrypto和libssl

如何导入jar包

-T/home/a/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/lib/ldscripts/armelf_linux_eabi.xsc

Android 导入第三方jar包步骤方法:1.将第三方jar包加入到lib此外,在执行Ja类的过程中,如果Ja类需要与C组件沟通时,VM就会去载入C组件,然后让Ja的函数顺利地调用到C组件的函数。此时,VM扮演着桥梁的角色,让Ja与C组件能通过标准的JNI介面而相互沟通。s文件夹中2.有两种方式将jar引入进工程目录:种是打开工程所在Project Structure,然后选择Dependencies,点击那个加号选择File Dependency ,然后再Libs文#20 pc 00049ff9 //lib/libm.so件夹中选择要导入的jar包然后点击确定,jar包就导入进来了。第二种方式是:右键点击libs文件夹中的jar文件选择 add as Library...然后选择Model,这样也可以导入成功。

android studio怎么导入包

#03 pc 00004fb4 /data/app-lib/com.example.hellojni-2/libhello-jni.so

将第三方jar包加入到libs文件夹中

#00 pc 00023438 //lib/libc.so

有两种方式将jar引入进工程目录:种是打开工程所在Project Structure,然后选择Dependencies,点击那个加号选择File Dependency ,

然后再Libs文件夹中选择要导入的jar包,然后点击确定,jar包就导入进来了。

第二种方式是:右键点击libs文件夹中的jar文件选择 add as#02 pc 000056c8 /data/app-lib/com.example.hellojni-2/libhello-jni.so Library...然后选择Model,这样也可以导入成功。

点击启动AndroidStudio

你需要添加的jar,并将其黏贴到app— —src— —main— —libs文件夹下,可运行的AndroidStudio项目都有像这样的目录结构。可以看到虽然jar已经黏贴过来了,但是还未导入,所以看不到jar中包含的内容。而已导入的jar,则可以看到jar中内容。

右键点击新黏贴的jar,在弹出菜单中点击Add As Library.

选择你要导入到的那个module(在AndroidStudio中相当于Eclipse中的project),如果当前只是一个项目,下拉框中除了app也没有其他的内容,那么直接点击ok确认。

这样jar就被添加到项目中来了。

C4D的源文件在win文件夹下怎么能查看预览小图(就是下面图的那样子)

#18 pc 0002b7fc //lib/libm.so

1、首先打开C4D安装路径,如图下。

[I jintArray int[]

2、打开路径文件夹Cinema 4D R19

#20 pc 00049ff9 //lib/libm.so

3、打开路径文件夹C:WindowsSystem32,粘贴刚的文件放在当前文件夹。

4、快捷键win+R,运行,输入CMD,按回车键。

5、然后ctrl+v粘贴,确认回车键。

6、即可查看C4D文件,完成效果图。

怎样使用Android Studio引用本地aar文件

3.registerNativeMods()函数的用途

首先,用Android Studio创建一个Android项目,然后找到我们需要引用的本地arr文件

将本地arr文件Copy到我们项目的libs文件夹下,没错就APP_PROJECT_PATH := $(call my-dir)/project是和jar放在同一个文件夹下,这里需要注意的是:是放在主项目的libs文件夹下,别放错了

Copy完以后,打开我们主项目下的build.gradle构建文件

然后再构建文件中输入

reitories{ flatDir { dirs 'libs' }}

这是一个本Android NDK是什么,为什么我们要用NDK?地的“仓库”不要写错了

然后接着在构建文件的dependencies大括号中,输入compile(name:'arcgis-android-v10.2.7', ext:'aar'),“arcgis-android-v10.2.7”是arr文件的文件名,“arr”则是文件的扩展名,别写错了

以上作完成后,点击菜单栏的重新构建按钮,对项目进行重新构建,然后稍等一下

如果没有发生错误的话,我们打开依次主项目的build--->intermediates--->exploded-aar,就会看到我们刚才引用的arr文件,到此arr文件就引用成功了

安卓bp中怎么引入内部头文件

#10 pc 0006100b //lib/libm.so

新增Android.bp文件

3、之后在其他项目中添加一句gradle依赖便方便的引用了该library

在新增的libs文件夹下加入Android.bp文件,新增如下内容

ja_import {

name: "testlib_jar",

jars: ["libs/testlib.jar"],

修改模块中的Android.bp

需要在android_app的主模块中新增上面定义的name的值

android_app {

name: “xxx”,

static_libs: [

“testlib_jar”,

],

如果不想在libs文件夹新增Android.bp文件,可以把ja_import放入到Android.bp中

修改diff文件如下:

@@ -23,6 +23,16 @@ ja_library {

type: "nano",

},

}+//prebuilt testlib.jar

+ja_import {

+ name: "testlib_jar",

+ jars: ["libs/testlib.jar"],

+}

ja_library {

@@ -63,7 +63,9 @@ android_library {

"dagger2-2.19",

- "jsr330"

+ "jsr330",

+ "testlib_jar",

],

manifest: "AndroidManif

如果是新增so方法,类似#11 pc 0006c6eb //lib/libm.so:

@@ -199,8 +199,11 @@ android_app {

+ jni_libs: [

+ "libjni_test_api

如何定位Android NDK开发中遇到的错误

NDK错误发生时,我们能拿到什么信息?

利用Android

NDK开发本地应用的时候,几乎所有的程序员都遇到过程序崩溃的问题,但它的崩溃会在logcat中打印一堆看起来类似天书的堆栈信息,让人举足无措。单靠添加一行行的打印信息来定位错误代码做在的行数,无疑是一件令人崩溃的事情。在网上搜索“Android

NDK崩溃”,可以搜索到很多文章来介绍如何通过Android提供的工具来查找和定位NDK的错误,但大都晦涩难懂。下面以一个实际的例子来说明,首先生成一个错误,然后演示如何通过两种不同的方法,来定位错误的函数名和代码行。

首先,看我们在hello-jni程序的代码中做了什么(有关如何创建或导入工程,此处略),看下图:在JNI_OnLoad()的函数中,即so加载时,调用willCrash()函数,而在willCrash()函数中, std::string的这种赋值方产生一个空指针错误。这样,在hello-jni程序加载时就会闪退。我们记一下这两个行数:在61行调用了willCrash()函数;在69行发生了崩溃。

[plain] view

plain copy

Build fingerprint: 'vivo/bbk89_cmcc_jb2/bbk89_cmcc_jb2:4.2.1/JOP40D/1372668680:user/test-keys'

pid: 32607, tid: 32607, name: xample.hellojni >>> com.example.hellojni <<<

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000

r0 00000000 r1 beb123a8 r2 80808080 r3 00000000

r4 5d635f68 r5 5cdc3198 r6 41efcb18 r7 5d62df44

r8 4121b0c0 r9 00000001 sl 00000000 fp beb1238c

ip 5d635f7c sp beb12380 lr 5d62ddec pc 400e7438 cpsr 60000010

backtrace:

#01 pc 00004de8 /data/app-lib/com.example.hellojni-2/libhello-jni.so

#04 pc 00004f58 /data/app-lib/com.example.hellojni-2/libhello-jni.so

#06 pc 00068005 //lib/libm.so

#07 pc 000278a0 //lib/libm.so

#08 pc 0002b7fc //lib/libm.so

#09 pc 00060fe1 //lib/libm.so

#12 pc 00067a1f //lib/libm.so

#13 pc 000278a0 //lib/libm.so

#14 pc 0002b7其中比较难以理解的是第二个参数,例如fc //lib/libm.so

#15 pc 00061307 //lib/libm.so

#16 pc 00062d //lib/libm.so

#17 pc 000278a0 //lib/libm.so

#21 pc 0004d419 //lib/libandroid_runtime.so

#23 pc 00001d37 //bin/app_process

#24 pc 0001bd98 //lib/libc.so

#25 pc 00001904 //bin/app_process

stack:

beb12348 00000035

beb1234c beb123c0 [stack]

……

如果你看过logcat打印的NDK错误时的日志就会知道,我省略了后面很多的内容,很多人看到这么多密密麻麻的日志就已经头晕脑胀了,即使是很多资深的Android开发者,在面对NDK日志时也大都默默的选择了无视

NDK错误发生时,能拿到什么信息

利用Android

NDK开发本地应用的时候,几乎所有的程序员都遇到过程序崩溃的问题,但它的崩溃会在logcat中打印一堆看起来类似天书的堆栈信息,让人举足无措。单靠添加一行行的打印信息来定位错误代码做在的行数,无疑是一件令人崩溃的事情。在网上搜索“Android

NDK崩溃”,可以搜索到很多文章来介绍如何通过Android提供的工具来查找和定位NDK的错误,但大都晦涩难懂。下面以一个实际的例子来说明,首先生成一个错误,然后演示如何通过两种不同的方法,来定位错误的函数名和代码行。

首先,看在hello-jni程序的代码中做了什么(有关如何创建或导入工程,此处略),看下图:在JNI_OnLoad()的函数中,即so加载时,调用willCrash()函数,而在willCrash()函数中, std::string的这种赋值方产生一个空指针错误。这样,在hello-jni程序加载时就会闪退。我们记一下这两个行数:在61行调用了willCrash()函数;在69行发生了崩溃。

[plain] view

plain copy

Build fingerprint: 'vivo/bbk89_cmcc_jb2/bbk89_cmcc_jb2:4.2.1/JOP40D/1372668680:user/test-keys'

pid: 32607, tid: 32607, name: xample.hellojni >>> com.example.hellojni <<<

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000

r0 00000000 r1 beb123a8 r2 80808080 r3 00000000

r4 5d635f68 r5 5cdc3198 r6 41efcb18 r7 5d62df44

r8 4121b0c0 r9 00000001 sl 00000000 fp beb1238c

ip 5d635f7c sp beb12380 lr 5d62ddec pc 400e7438 cpsr 60000010

backtrace:

#01 pc 00004de8 /data/app-lib/com.example.hellojni-2/libhello-jni.so

#04 pc 00004f58 /data/app-lib/com.example.hellojni-2/libhello-jni.so

#06 pc 00068005 //lib/libm.so

#07 pc 000278a0 //lib/libm.so

#08 pc 0002b7fc //lib/libm.so

#09 pc 00060fe1 //lib/libm.so

#12 pc 00067a1f //lib/libm.so

#13 pc 000278a0 //lib/libm.so

#14 pc 0002b7fc //lib/libm.so

#15 pc 00061307 //lib/libm.so

#16 pc 00062d //lib/libm.so

#17 pc 000278a0 //lib/libm.so

#21 pc 0004d419 //lib/libandroid_runtime.so

#23 pc 00001d37 //bin/app_process

#24 pc 0001bd98 //lib/libc.so

#25 pc 00001904 //bin/app_process

stack:

beb12348 00000035

beb1234c beb123c0 [stack]

……

如果你看过logcat打印的NDK错误时的日志就会知道,我省略了后面很多的内容,很多人看到这么多密密麻麻的日志就已经头晕脑胀了,即使是很多资深的Android开发者,在面对NDK日志时也大都默默的选择了无视。

是本地编程接口,它使得在 Ja 虚拟机 (VM) 内部运行的 Ja 代码能够与用其它编程语言(如 C、C++

和汇编语言)编写的应用程序和库进行交互作。

1.从如何载入.so档案谈起

Virtual Machine)来执行。VM在Android平台里,扮演很重要的角色。

应用层的Ja类是在虚拟机(VM: Vitual

Machine)上执行的,而C件不是在VM上执行,那么Ja程式又如何要求VM去载入(Load)所指定的C组件呢? 可使用下述指令:

System.loadLibrary(.so的档案名);

例如,Android框架里所提供的MediaPlayer.ja类,含指令:

这要求VM去载入Android的//lib/libmedia_jni.so档案。载入.so之后,Ja类与.so档案就汇合起来,一起执行了。

2.如何撰写.so的入口函数

---- JNI_OnLoad()与JNI_OnUnload()函数的用途

当Android的VreitoriesM(Virtual

Machine)执行到System.loadLibrary()函数时,首先会去执行C组件里的JNI_OnLoad()函数。它的用途有二:

(1)告诉VM此C组件使用那一个JNI版本。如果你的.so档没有提供JNI_OnLoad()函数,VM会默认该.so档是使用最老的 JNI

1.1版本。由于新版的JNI做了许多扩充,如果需要使用JNI的新版功能,例如JNI

1.4的ja.nio.ByteBuffer,就必须藉由JNI_OnLoad()函数来告知VM。

(2)由于VM执行到System.loadLibrary()函数时,就会立即先呼叫JNI_OnLoad(),所以C组件的开发者可以藉由JNI_OnLoad()来进行C组件内的初期值之设定(Initialization)

。例如,在Android的//lib/libmedia_jni.so档案里,就提供了JNI_OnLoad()函数,其程式码片段为:

此函数回传JNI_VERSION_1_4值给VM,于是VM知道了其所使用的JNI版本了。此外,它也做了一些初期的动作(可呼叫任何本地函数),例如指令:

JNI_OnUnload()函数与JNI_OnLoad()相对应的。在载入C组件时会立即呼叫JNI_OnLoad()来进行组件内的初期动作;而当VM释放该C组件时,则会呼叫JNI_OnUnload()函数来进行善后清除动作。当VM呼叫JNI_OnLoad()或

JNI_Unload()函数时,都会将VM的指针(Pointer)传递给它们,其参数如下:

jint JNI_OnUnload(JaVM vm, void reserved){ }

在JNI_OnLoad()函数里,就透过VM之指标而取得JNIEnv之指标值,并存入env指标变数里,如下述指令:

由于VM通常是多执行绪(Multi-threading)的执行环境。每一个执行绪在呼叫JNI_OnLoad()时,所传递进来的JNIEnv

指标值都是不同的。为了配合这种多执行绪的环境,C组件开发者在撰写本地函数时,可藉由JNIEnv指标值之不同而避免执行绪的资料冲突问题,才能确保所写的本地函数能安全地在Android的多执行绪VM里安全地执行。基于这个理由,当在呼叫C组件的函数时,都会将JNIEnv指标值传递给它,如下:

这JNI_OnLoad()呼叫register_android_media_MediaPlayer(env)函数时,就将env指标值传递过去。如此,在register_android_media_MediaPlayer()函数就能藉由该指标值而区别不同的执行绪,以便化解资料冲突的问题。

例如,在register_android_media_MediaPlayer()函数里,可撰写下述指令:

if ((env)->MonitorEnter(env, obj) != JNI_OK) {

}查看是否已经有其他执行绪进入此物件,如果没有,此执行绪就进入该物件里执行了。还有,也可撰写下述指令:

if ((env)->MonitorExit(env, obj) != JNI_OK) {

}查看是否此执行绪正在此物件内执行,如果是,此执行绪就会立即离开。

应用层级的Ja类别透过VM而呼叫到本地函数。一般是仰赖VM去寻找.so里的本地函数。如果需要连续呼叫很多次,每次都需要寻找一遍,会多花许多时间。此时,组件开发者可以自行将本地函数向VM进行登记。例如,在Android的//lib/libmedia_jni.so档案里的代码段如下:

当VM载入libmedia_jni.so档案时,就呼叫JNI_OnLoad()函数。接着,JNI_OnLoad()呼叫

register_android_media_MediaPlayer()函数。此时,就呼叫到

AndroidRuntime::registerNativeMods()函数,向VM(即AndroidRuntime)登记

gMods[]表格所含的本地函数了。简而言之,registerNativeMods()函数的用途有二:

(1)更去找到函数。

4.Andoird 中使用了一种不同传统Ja JNI的方式来定义其native的函数。其中很重要的区别是Andorid使用了一种Ja 和 C

函数的映射表数组,并在其中描述了函数的参数和返回值。这个数组的类型是JNINativeMod,定义如下:

"()V"

"(II)V"

"(Lja/lang/String;Lja/lang/String;)V"

实际上这些字符是与函数的参数类型一一对应的。

"()" 中的字符表示参数,后面的则代表返回值。例如"()V" 就表示void Func();

"(II)V" 表示 void Func(int, int);

具体的每一个字符的对应关系如下

字符 Ja类型 C类型

V void void

Z jboolean boolean

I jint int

J jlong long

D jdouble double

F jfloat float

B jbyte byte

C jchar char

数组则以"["开始,用两个字符表示

[F jfloatArray float[]

[C jcharArray char[]

[S jshortArray short[]

[D jdoubl[B jbyteArray byte[]eArray double[]

[J jlongArray long[]

[Z jbooleanArray boolean[]

上面的都是基本类型。如果Ja函数的参数是class,则以"L"开头,以";"结尾,中间是用"/"

隔开的包及类名。而其对应的C函数名的参数则为jobject. 一个例外是String类,其对应的类为jstring

Lja/lang/String; String jstring

Lja/net/Socket; Socket jobject

如果JAVA函数位于一个嵌入类,则用$作为类名间的分隔符。

例如 "(Lja/lang/String;Landroid/os/FileUtils$FileStatus;)Z"

Android JNI编程实践

一、直接使用ja本身jni接口(windows/ubuntu)

1.在Eclipsh中新建一个android应用程序。两个类:一个继承于Activity,UI显示用。另一个包含native方法。编译生成所有类。

以上在windows中完成。

2.使用jah命令生成C/C++的.h文件。注意类要包含包名,路径文件夹下要包含所有包中的类,否则会报找不到类的错误。classpath参数指定到包名前一级文件夹,文件夹层次结构要符合ja类的组织层次结构。

jah -classpath ../jnitest/bin com.hello.jnitest.Nadd

com_hello_jnitest_Nadd .h文件:

3.编辑.c文件实现native方法。

com_hello_jnitest_Nadd.c文件:

4.编译.c文件生存动态库。

arm-none-linux-gnueabi-gcc -I/home/a/work/android/jdk1.6.0_17/include

-I/home/a/work/android/jdk1.6.0_17/include/linux -fpic -c

com_hello_jnitest_Nadd.c

arm-none-linux-gnueabi-ld

-share -o libNadd.so com_hello_jnitest_Nadd.o

得到libNadd.so文件。

以上在ubuntu中完成。

5.将相应的动态库文件push到d的/lib中:adb push libNadd.so

//lib。若提示Read-only file 错误,运行adb remount命令,即可。

6.在eclipsh中运行原应用程序即可。

以上在windows中完成。

对于一中生成的so文件也可采用二中的方法编译进apk包中。只需在工程文件夹中建libs/armeabi文件夹(其他文件夹名无效,只建立libs文件夹也无效),然后将so文件拷入,编译工程即可。

二.使用NDK生成本地方法(ubuntu and windows)

1.安装NDK:解压,然后进入NDK解压后的目录,运行build/host-setup.sh(需要Make

3.81和awk)。若有错,修改host-setup.sh文件:将#!/bin/sh修改为#!/bin/bash,再次运行即可。

2.在apps文件夹下建立自己的工程文件夹,然后在该文件夹下建一文件Application.mk和项project文件夹。

Application.mk文件:

APP_MODULES := myjni

3.在project文件夹下建一jni文件夹,然后新建Android.mk和myjni.c。这里不需要用jah生成相应的.h文件,但函数名要包含相应的完整的包、类名。

4.编辑相应文件内容。

Android.mk文件:

myjni文件组织:

a@ubuntu :~/work/android/ndk-1.6_r1/apps$ tree myjni

myjni

|-- Application.mk

`-- project

|-- jni

| |-- Android.mk

| `-- myjni.c

`-- libs

`-- armeabi

以上内容在ubuntu完成。以下内容在windows中完成。当然也可以在ubuntu中完成。

NdkTest.ja文件:

对于二中生成的so文件也可采用一中的方法push到d中运行。

NDK错误发生时,我们能拿到什么信息?

利用Android

NDK开发本地应用的时候,几乎所有的程序员都遇到过程序崩溃的问题,但它的崩溃会在logcat中打印一堆看起来类似天书的堆栈信息,让人举足无措。单靠添加一行行的打印信息来定位错误代码做在的行数,无疑是一件令人崩溃的事情。在网上搜索“Android

NDK崩溃”,可以搜索到很多文章来介绍如何通过Android提供的工具来查找和定位NDK的错误,但大都晦涩难懂。下面以一个实际的例子来说明,首先生成一个错误,然后演示如何通过两种不同的方法,来定位错误的函数名和代码行。

首先,看我们在hello-jni程序的代码中做了什么(有关如何创建或导入工程,此处略),看下图:在JNI_OnLoad()的函数中,即so加载时,调用willCrash()函数,而在willCrash()函数中, std::string的这种赋值方产生一个空指针错误。这样,在hello-jni程序加载时就会闪退。我们记一下这两个行数:在61行调用了willCrash()函数;在69行发生了崩溃。

[plain] view

plain copy

Build fingerprint: 'vivo/bbk89_cmcc_jb2/bbk89_cmcc_jb2:4.2.1/JOP40D/1372668680:user/test-keys'

pid: 32607, tid: 32607, name: xample.hellojni >>> com.example.hellojni <<<

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000

r0 00000000 r1 beb123a8 r2 80808080 r3 00000000

r4 5d635f68 r5 5cdc3198 r6 41efcb18 r7 5d62df44

r8 4121b0c0 r9 00000001 sl 00000000 fp beb1238c

ip 5d635f7c sp beb12380 lr 5d62ddec pc 400e7438 cpsr 60000010

backtrace:

#01 pc 00004de8 /data/app-lib/com.example.hellojni-2/libhello-jni.so

#04 pc 00004f58 /data/app-lib/com.example.hellojni-2/libhello-jni.so

#06 pc 00068005 //lib/libm.so

#07 pc 000278a0 //lib/libm.so

#08 pc 0002b7fc //lib/libm.so

#09 pc 00060fe1 //lib/libm.so

#12 pc 00067a1f //lib/libm.so

#13 pc 000278a0 //lib/libm.so

#14 pc 0002b7fc //lib/libm.so

#15 pc 00061307 //lib/libm.so

#16 pc 00062d //lib/libm.so

#17 pc 000278a0 //lib/libm.so

#21 pc 0004d419 //lib/libandroid_runtime.so

#23 pc 00001d37 //bin/app_process

#24 pc 0001bd98 //lib/libc.so

#25 pc 00001904 //bin/app_process

stack:

beb12348 00000035

beb1234c beb123c0 [stack]

……

如果看过logcat打印的NDK错误时的日志就会知道,省略了后面很多的内容,很多人看到这么多密密麻麻的日志就已经头晕脑胀了,即使是很多资深的Android开发者,在面对NDK日志时也大都默默的选择了无视。

Android NDK 是在SDK前面又加上了“原生”二字,即Native Dlopment Kit,因此又被Google称为“NDK”。众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。NDK包括了:

从C / C++生成原生代码库所需要的工具和build files。

将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files,即.apk文件)中。

支持所有未来Android平台的一些列原生系统头文件和库

为何要用到NDK?概括来说主要分为以下几种情况:

代码的保护,由于apk的ja层代码很容易被反编译,而C/C++库反汇难度较大。

在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。

便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。

Android JNI是什么?和NDK是什么关系?

Ja Native Intece(JNI)标准是ja平台的一部分,它允许Ja代码和其他语言写的代码进行交互。JNI是本地编程接口,它使得在 Ja 虚拟机(VM) 内部运行的 Ja 代码能够与用其它编程语言(如 C、C++和汇编语言)编写的应用程序和库进行交互作。

gdb调试 ndk-stack 位置(android-ndk-r10e

dk-stack)

命令行窗口:

adb logcat | ndk-stack -sym ./lib/armeabi

这个问题比较复杂,一个文章你看看,

android怎么导入jar包

jint JNI_OnLoad(JaVM vm, void reserved) { }

1、将第三方jar包加入到libs文件夹中

2、有两种方式将jar引入进工程目录:种是打开工程所在Project Structur5.编译:make APP=myjni.e,然后选择

Dependencies,点击那个加号选择File Dependency ,然后再Libs文件夹中选择要导入的jar包;

3、然后点击确定,jar包就导入进来了。第二种方式是:右键点击libs文件夹中的jar文件选择 add as Library...然后选择Mod#22 pc 0004e1bd //lib/libandroid_runtime.soel,这样也可以导入成功。

ja项目中怎样看使用的是什么框架啊?

beb12340 012153f8

通过MAVEN4 directories, 4 files配置文件中配置信息一般就能看出来吧,最直接的可以看看引用了哪些jar包,也可以分析出来。

压缩软件打开struts.jar里面应该有lnse文件,可Ja Native Intece (JNI)标准是ja平台的一部分,它允许Ja代码和其他语言写的代码进行交互。JNI以从中看出struts版本。

看源码代码架构和xml文件,界面是看不出来的,只能看看他前台技术用了哪些,可以通过war,通用的ssh,springMVC。