百度
360搜索
搜狗搜索

android jni开发,Android NDK Jni 开发C和C++的区别详细介绍

本文目录一览: AndroidNDK开发简介NDK和SDK以及JNI有什么关系_安卓ndk是干嘛的

NDK:AndroidNDK是在SDK前面又加上了“原生”二字,即NativeDevelopmentKit,因此又被Google称为“NDK”。
NDK全称:NativeDevelopmentKit。
NDK是一系列工具的集合。
*NDK提供了一系列的工具,帮助开发者快速开发C(或C)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。
*NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。
*NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
其实:
NDK就是能够方便快捷开发.so文件的工具。JNI的过程比较复杂,生成.so需要大量操作,而NDK就是简化了这个过程。
AndroidSDK:
SDK(softwaredevelopmentkit)软件开发工具包。被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。因此!AndroidSDk指的既是Android专属的软件开发工具包
JNI:
JavaNativeInterface(JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI是本地编程接口,它使得在Java虚拟机(VM)内部运行的Java代码能够与用其它编程语言(如C、C和汇编语言)编写的应用程序和库进行交互操作
当然一般需要进行如下操作流程:
1)编写java程序:这里以HelloWorld为例。为了实现在java代码中调用c函数printf。
代码1:
classHelloWorld{
publicnativevoid();
static{
System.loadLibrary("hello");
}
publicstaticvoidmain(String[]args){
newHelloWorld().();
}
}
声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明改方法为native的,并且不能实现。
Load动态库:System.loadLibrary("hello");
这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary()的参数“hello”是动态库的名字。
2)编译
javacHelloWorld.java
3)生成扩展名为h的头文件javah?
JNIEXPORTvoidJNICALLJava_HelloWorld_(JNIEnv*,jobject);
这个h文件相当于我们在java里面的接口,这里声明了一个Java_HelloWorld_(JNIEnv*,jobject)方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C程序的时候所使用的方法名必须和这里的一致)。
4)编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法
代码2:
#include"jni.h"
#include"HelloWorld.h"
#includeotherheaders
JNIEXPORTvoidJNICALLJava_HelloWorld_(JNIEnv*env,jobjectobj)
{
printf("Helloworld!/n");
return;
}
注意代码2中的第1行,需要将jni.h(该文件可以在%JAVA_HOME%/include文件夹下面找到)文件引入,因为在程序中的JNIEnv、jobject等类型都是在该头文件中定义的;另外在第2行需要将HelloWorld.h头文件引入。然后保存为.c就ok了。
5)生成动态库
这里以在Windows中为例,需要生成dll文件。在保存.c文件夹下面,使用VC的编译器cl成。cl-I%java_home%/include-I%java_home%/include/win32-LD.c-Fehello.dll注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。
另外需要将-I%java_home%/include-I%java_home%/include/win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。

如何用java进行安卓应用的开发

Android应用是以Java为外壳的,C艹代码得先通过NDK交叉编译成.so共享库再由Java调用,C艹代码和Java交互是使用jni来实现,Android已经有了NativeInterface,其中就用到了很多jni的内容。JNI全名Javanativeinterface。
直接百度搜索安卓开发教程,资源非常多。先去把Java和C学好再说。Java可以选择Headfirstjava作为入门书,C可以选择CPrimerPlus作为入门书

android中jni开发怎么生成头文件

总共有三种方式生成Jni头文件,但归根结底只有一种,只是操作方法不一样,我在这里做一下记录,方便下次使用。
1.1
1.利用Android Studio的Terminal,进入你自己的Android工程文件的app/src/main目录,例如(D:\Users\AndroidStudio\Application\app\src\main)
在Terminal中输入命令
cd app\src\main
这样就进入到了main目录,可以使用dir命令查看当前目录有哪些文件
总共有三种方式生成Jni头文件
2. 在Terminal中输入命令
javah -d jni -jni -classpath ..\..\build\intermediates\classes\debug com.example.lenovo.application.JniClass
解释:
-d

输出目录,后面跟上要生成的目录名

-jni 生成Jni样式的标头文件

-classpath

指定加载类的路径,后面跟上你要生成头文件的这个类的路径,例如:

..\..\..\build\intermediates\classes\debug(这个是类所在的路径)

com.example.lenovo.application.JniClass(类的包名)

注意,要生成.class文件,要Make Project

3.如果前面没有出错的话,就能看到jni文件和生成的头文件

其实jni目录可以不用命令生成,Android Studio已经为我们准备好了。

这样就能快速的生成jni目录了。

然后在Terminal中进入到该目录,输入命令

cd app\src\main\jni

在执行如下命令

javah -d jni -jni -classpath ..\..\build\intermediates\classes\debug com.example.lenovo.application.JniClass

这样也能生成头文件

利用Windows的cmd生成jni头文件

1.进入到你自己Android工程目录下的app\build\intermediates\classes\debug

2.然后Shift加鼠标右键,点击红色方框的内容

3.出现cmd命令行,输入如下命令

javah -jni com.example.lenovo.application.JniClass

4.会在当前目录生成*.h头文件,把它拷贝进jni目录就可以了。

jni目录可以按照上面的方法创建

至此,生成jni头文件的三种方法讲解完毕。
Android NDK Jni 开发C和C++的区别

Android NDK Jni 开发C和C++的区别
由于Android官方NDK例子大多使用C语言编写,所以当我们想用C++进行开发时,会出现种种错误。下面简单说说几点不同之处,代码中用红色标出了不同之处:
1.先来一个用C写的例子:
(1)hello.c文件。在C中没有引用,传递的env是个两级指针,用(*env)->调用方法且方法中要传入env.
1 #include

2

3 jstring Java_com_example_Hello_hello(JNIEnv* env, jobject thiz) {

4 return (*env)->NewStringUTF(env,"Hello Jni---->C!");

5 }

(2)Android.mk文件,更改后缀名为.c

复制代码

1 LOCAL_PATH := $(call my-dir)

2

3 include $(CLEAR_VARS)

4

5 LOCAL_MODULE := hello

6 LOCAL_SRC_FILES := hello.c

7

8 include $(BUILD_SHARED_LIBRARY)

复制代码

2.再来一个用C++写的例子:

(1)hello.cpp文件。C++中env为一级指针,用env->调用方法,无需传入env;C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern "C"进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名;exter "C"{jni代码}。

复制代码

复制代码

1 #include

2

3 #ifdef __cplusplus

4 extern "C" {

5 #endif

6 jstring Java_com_example_Hello_hello(JNIEnv* env, jobject thiz) {

7 return env->NewStringUTF("Hello Jni---->C++!");

8 }

9 #ifdef __cplusplus

10 }

11 #endif

复制代码

复制代码

(2)Android.mk文件,更改后缀名为.cpp

复制代码

1 LOCAL_PATH := $(call my-dir)

2

3 include $(CLEAR_VARS)

4

5 LOCAL_MODULE := hello

6 LOCAL_SRC_FILES := hello.cpp

7

8 include $(BUILD_SHARED_LIBRARY)

Android NDK Jni 开发C和C++的区别

  NDK是谷歌开发的一用于Android开发调用C语言的工具,而JNI是Java调用C语言的协议,桥梁。
  谷歌在Android2.3版本变开发出NDK供开发者使用,开发者使用它可以很方便的调用C代码,而代码书写规范需要遵循JNI协议进行定义。
  JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。

如何在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 plaincopyprint?
  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 plaincopyprint?
  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 plaincopyprint?
  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[选项]

阅读更多 >>>  linux驱动和android有区别吗

  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 plaincopyprint?

  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 plaincopyprint?

  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 plaincopyprint?

  01.$sudo vim /etc/profile

  02.exportPATH=/usr/local/ndk:$PATH

  $sudo vim /etc/profile

  exportPATH=/usr/local/ndk:$PATH

  编辑完毕后保存退出,并重启生效

  (4)验证安装

  [plain] view plaincopyprint?

  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 plaincopyprint?

  01.privatenativeString GetReply();

  privatenativeString GetReply();

  native表示这个方法由本地代码定义,需要通过jni接口调用本地c/c++代码。

  [java] view plaincopyprint?

  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 plaincopyprint?

  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 plaincopyprint?

  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 plaincopyprint?

  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 plaincopyprint?

  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 plaincopyprint?

  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 plaincopyprint?

  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 plaincopyprint?

  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 plaincopyprint?

  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,即可在模拟器上启动程序

阅读更多 >>>  如何在linux运行apk












Android NDK Jni 开发C和C++的区别

JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。 标准的java类库可能不支持你的程序所需的特性。 JNI·或许你已经有了一个用其他语言写成的库或程序,而你希望在java程序中使用它。你可能需要用底层语言实现一个小型的时间敏感代码,比如汇编,然后在你的java程序中调用这些功能。 NDK是Google公司推出的帮助Android开发者通过C/C++本地语言编写应用的开发包,包含了C/C++的头文件、库文件、说明文档和示例代码,我们可以理解为Windows Platform SDK一样,是纯C/C++编写的,但是Android并不支持纯C/C++编写的应用,同时NDK提供的库和函数功能很有限,仅仅处理些算法效率敏感的问题,所以推荐初学者学好Java后再学习JNI。 NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。 NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。
jni是java与c/c++相互调用的一套api
Android NDK Jni 开发C和C++的区别
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。 标准的java类库可能不支持你的程序所需的特性。 JNI·或许你已经有了一个用其他语言写成的库或程序,而你希望在java程序中使用它。你可能需要用底层语言实现一个小型的时间敏感代码,比如汇编,然后在你的java程序中调用这些功能。 NDK是Google公司推出的帮助Android开发者通过C/C++本地语言编写应用的开发包,包含了C/C++的头文件、库文件、说明文档和示例代码,我们可以理解为Windows Platform SDK一样,是纯C/C++编写的,但是Android并不支持纯C/C++编写的应用,同时NDK提供的库和函数功能很有限,仅仅处理些算法效率敏感的问题,所以推荐初学者学好Java后再学习JNI。 NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。 NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

android studio JNI开发时 编译成功 但是没有生成.so文件 什么原因

1
在交叉编译的时候怎么都无法生成so文件,javah生成头文件没错,c文件也没错,java文件也没错,
2.原因:是JNI文件夹路径不对
3
在执行javah命令时,我进入的是cd
app/src/main/java
这样jni文件夹在java文件夹下,作为一个包存在,这样就无法生成so文件
执行javah的正确姿势:
4
进入app/src/main目录:cd
app/src/main
执行javah命令:javah
javah
-d
jni
-classpath
./Java
lab.sodino.jnitest.MainActivity
5,
-d
jni
头文件生成到jni文件夹(当前在

\app\src\main目录下,所以.h所在的目录为

\app\src\main\jni



-classpath

./java

指定去当前路径下java下寻找包名指定的类

这样再rebuild一下,就会生成so文件了

005android初级篇之jni 一个简单的报错No implementation found for

在android中使用ndk开发需要使用到jni。

原因:
public class JniSocket {
static {
System.loadLibrary("SmartSocket");
}

其中指令没有被执行,改为如下运行正常;
public class JniSocket {

检查jni类似错误的方法

为什么要用jni的方式来编辑android的程序,相对来讲有什么好处吗?相比纯java?

效率,,java是面向对象的,离计算机的理解能力有点远。c、c++都是做linux内核驱动的。不然android怎么对得起别的程序员,不壮大团队怎么跟苹果竞争。
有时候通过存java访问不到linux某些东西,jni就可以.而且相对于效率上而言jni比android 高
NATIVE 带来的性能提升,以及可以突破VM的内存限制
android的jni可以使用c/c++来开发,相比java而言,运行的效率提高了很多,特别是在做一些图像算法,或者游戏逻辑的时候,使用jni将大大的提高效率。比如某个游戏要采用opengl,同样加载一个由1000个多边形组成的3d模型,jni要比java运算快好几倍,这样就保证了游戏运行的fps不会太低。
另外一个好处就是内存管理上面,java的内存管理全部由虚拟机来管理,C++由程序员来管理,利用率上面就好多了。
等等其他优点。
既然这么多的优点,为什么一个android程序不采用纯c来开发呢?因为是android的 UI framework采用java,所以,在UI上面还是采用java来开发。

网站数据信息

"android jni开发,Android NDK Jni 开发C和C++的区别"浏览人数已经达到19次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:android jni开发,Android NDK Jni 开发C和C++的区别的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!