`

Android JNI详述(二)

阅读更多

Android JNI 编程实践
  
  一、直接使用java 本身jni 接口(windows/ubuntu
  
  1.Eclipsh 中新建一个android 应用程序。两个类:一个继承于ActivityUI 显示用。另一个包含native 方法。编译生成所有类。
  
  jnitest.java 文件:
  
  package com.hello.jnitest;
  
  
  
  import android.app.Activity;
  
  import android.os.Bundle;
  
  
  
  public class jnitest extends Activity {
  
   /** Called when the activity is first created. */
  
   @Override
  
   public void onCreate(Bundle savedInstanceState) {
  
   super.onCreate(savedInstanceState);
  
  
  
   setContentView(R.layout.main);
  
  
  
   Nadd cal = new Nadd();
  
  
  
   setTitle("The Native Add Result is " + String.valueOf(cal.nadd(10, 19)));
  
   }
  
  }
  
  Nadd.java 文件:
  
  package com.hello.jnitest;
  
  
  
  public class Nadd {
  
  
  
   static {
  
   System.loadLibrary("Nadd");
  
   }
  
  
  
   public native int nadd(int a, int b);
  
  
  
  }
  
  以上在windows 中完成。
  
  2. 使用javah 命令生成C/C++.h 文件。注意类要包含包名,路径文件夹下要包含所有包中的类,否则会报找不到类的错误。classpath 参数指定到包名前一级文件夹,文件夹层次结构要符合java 类的组织层次结构。
  
  javah -classpath ../jnitest/bin com.hello.jnitest.Nadd
  
  com_hello_jnitest_Nadd .h 文件:
  
  /* DO NOT EDIT THIS FILE - it is machine generated */
  
  #include
  
  /* Header for class com_hello_jnitest_Nadd */
  
  
  
  #ifndef _Included_com_hello_jnitest_Nadd
  
  #define _Included_com_hello_jnitest_Nadd
  
  #ifdef __cplusplus
  
  extern "C" {
  
  #endif
  
  /*
  
   * Class: com_hello_jnitest_Nadd
  
   * Method: nadd
  
   * Signature: (II)I
  
   */
  
  JNIEXPORT jint JNICALL Java_com_hello_jnitest_Nadd_nadd
  
   (JNIEnv *, jobject, jint, jint);
  
  
  
  #ifdef __cplusplus
  
  }
  
  #endif
  
  #endif
  
  3. 编辑.c 文件实现native 方法。
  
  com_hello_jnitest_Nadd.c 文件:
  
  #include
  
  #include "com_hello_jnitest_Nadd.h"
  
  JNIEXPORT jint JNICALL Java_com_hello_jnitest_Nadd_nadd(JNIEnv * env, jobject c, jint a, jint b)
  
  {
  
   return (a+b);
  
  }
  
  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 -T/home/a/CodeSourcery/Sourcery_G++_Lite/arm-none-linux-gnueabi/lib/ldscripts/armelf_linux_eabi.xsc -share -o libNadd.so com_hello_jnitest_Nadd.o
  
  得到libNadd.so 文件。
  
  以上在ubuntu 中完成。
  
  5. 将相应的动态库文件pushavdsystem/lib:adb push libNadd.so /system/lib 。若提示Read-only file system 错误,运行adb remount 命令,即可。
  
  Adb push libNadd.so /system/lib
  
  6.eclipsh 中运行原应用程序即可。
  
  以上在windows 中完成。
  
  对于一中生成的so 文件也可采用二中的方法编译进apk 包中。只需在工程文件夹中建libs\armeabi 文件夹(其他文件夹名无效,只建立libs 文件夹也无效),然后将so 文件拷入,编译工程即可。

 

. 使用NDK 生成本地方法(ubuntu and windows
  
  1. 安装NDK :解压,然后进入NDK 解压后的目录,运行build/host-setup.sh (需要Make 3.81awk )。若有错,修改host-setup.sh 文件:将#!/bin/sh 修改为#!/bin/bash ,再次运行即可。
  
  2.apps 文件夹下建立自己的工程文件夹,然后在该文件夹下建一文件Application.mk 和项project 文件夹。
  
  Application.mk 文件:
  
  APP_PROJECT_PATH := $(call my-dir)/project
  
  APP_MODULES := myjni
  
  3.project 文件夹下建一jni 文件夹,然后新建Android.mkmyjni.c 。这里不需要用javah 生成相应的.h 文件,但函数名要包含相应的完整的包、类名。
  
  4. 编辑相应文件内容。
  
  Android.mk 文件:
  
  # Copyright (C) 2009 The Android Open Source Project
  
  #
  
  # Licensed under the Apache License, Version 2.0 (the "License");
  
  # you may not use this file except in compliance with the License.
  
  # You may obtain a copy of the License at
  
  #
  
  # http://www.apache.org/licenses/LICENSE-2.0
  
  #
  
  # Unless required by applicable law or agreed to in writing, software
  
  # distributed under the License is distributed on an "AS IS" BASIS,
  
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  
  # See the License for the specific language governing permissions and
  
  # limitations under the License.
  
  #
  
  LOCAL_PATH := $(call my-dir)
  
  
  
  include $(CLEAR_VARS)
  
  
  
  LOCAL_MODULE := myjni
  
  LOCAL_SRC_FILES := myjni.c
  
  
  
  include $(BUILD_SHARED_LIBRARY)
  
  
  
  myjni.c 文件:
  
  #include
  
  #include
  
  
  
  jstring
  
  Java_com_hello_NdkTest_NdkTest_stringFromJNI( JNIEnv* env,
  
   jobject thiz )
  
  {
  
   return (*env)->NewStringUTF(env, "Hello from My-JNI !");
  
  }
  
  myjni 文件组织:
  
  a@ubuntu:~/work/android/ndk-1.6_r1/apps$ tree myjni
  
  myjni
  
  |-- Application.mk
  
  `-- project
  
   |-- jni
  
   | |-- Android.mk
  
   | `-- myjni.c
  
   `-- libs
  
   `-- armeabi
  
   `-- libmyjni.so
  
  
  
  4 directories, 4 files
  
  5. 编译:make APP=myjni.
  
  以上内容在ubuntu 完成。以下内容在windows 中完成。当然也可以在ubuntu 中完成。
  
  6.eclipsh 中创建android application 。将myjni 中自动生成的libs 文件夹拷贝到当前工程文件夹中,编译运行即可。
  
  NdkTest.java 文件:
  
  package com.hello.NdkTest;
  
  
  
  import android.app.Activity;
  
  import android.os.Bundle;
  
  import android.widget.TextView;
  
  
  
  public class NdkTest extends Activity {
  
   /** Called when the activity is first created. */
  
   @Override
  
   public void onCreate(Bundle savedInstanceState) {
  
   super.onCreate(savedInstanceState);
  
   TextView tv = new TextView(this);
  
   tv.setText( stringFromJNI() );
  
   setContentView(tv);
  
   }
  
  
  
   public native String stringFromJNI();
  
  
  
   static {
  
  
  
   System.loadLibrary("myjni");
  
   }
  
  }
  
  对于二中生成的so 文件也可采用一中的方法pushavd 中运行。

 

 

分享到:
评论

相关推荐

    JNI技术各类文档

    - **官方文档**:Oracle提供的官方JNI规范,详述所有接口和功能。 - **最佳实践**:关于编写高效、安全和可维护的JNI代码的建议。 - **案例研究**:实际应用中的JNI实现,例如与图形库、音频处理库或其他系统服务...

    pcl-android-180-build.zip

    在Android应用中使用PCL时,通常会通过NDK将PCL库编译为本地库,然后在Java层通过JNI(Java Native Interface)调用。 关于如何在Android项目中集成PCL-android-180-build.zip,通常需要以下步骤: 1. 解压下载的...

    √ANDROID框架揭秘_清晰版.zip

    本书的核心内容涵盖了Android框架层的关键组件和技术,包括Activity管理、Intent机制、Service运行机制、BroadcastReceiver、ContentProvider、View系统以及JNI开发等方面。 1. **Activity管理**:Activity是...

    android应用开发基础教程

    #### 二、JNI调用讲解 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。在Android应用开发中,JNI主要用于实现性能要求较高的部分,例如图形处理、音频解码等,...

    Android官方API文档完整版.rar

    11. **Android NDK与JNI** 对于需要使用C++代码或调用原生库的开发者,NDK和JNI提供了在Java与C/C++之间交互的接口。文档中详细介绍了如何使用它们。 12. **测试与调试** Android提供了强大的测试框架,包括单元...

    深入理解Android 卷Ⅰ卷Ⅱ 邓凡平.zip

    1. **Android系统服务**:详述系统服务的运行和管理,如电源管理、位置服务等。 2. **多媒体支持**:解析音频、视频的处理以及相机API的使用。 3. **图形与渲染**:探讨OpenGL ES、SurfaceFlinger和硬件加速技术。 4...

    交叉编译libvpx源码后 生成的头文件和库 android使用

    6. **集成到Android项目**:将生成的头文件和库文件添加到Android项目的jniLibs目录下,根据不同的ABI(armeabi-v7a, arm64-v8a, x86, x86_64等)放入对应的子目录。然后在Android Studio的CMake配置中引入头文件和...

    qt on android 核心编程 安晓辉

    4. **Android原生API集成**:探讨如何使用Java本地接口(JNI)调用Android原生API,实现Qt应用与Android系统的深度集成,如访问硬件设备、使用系统服务等。 5. **性能优化**:分享提高Qt on Android应用性能的技巧...

    unlocking android

    5. **系统编译与定制**:详述如何从源代码编译Android系统,以及如何根据需求定制系统,包括修改启动器、主题、内核和其他核心组件。 6. **签名与加密**:介绍Android应用的签名机制,以及如何使用数字证书来验证...

    android-sdk-NDK19.2.rar

    为了充分利用NDK19.2,开发者需要熟悉C/C++编程,了解JNI原理,并掌握Android Studio的相关配置。同时,需要注意的是,虽然NDK提供了性能优势,但过度使用原生代码也可能增加应用的复杂性和体积,因此在使用时需权衡...

    Android系统开发入门[定义].pdf

    4. **在Android系统中编写JNI方法**:利用JNI(Java Native Interface)实现Java代码与C/C++代码的互操作,使得Java应用程序可以调用硬件驱动。 5. **在Android应用程序框架层增加硬件服务接口**:设计并实现框架层...

    详述安卓wifi开发流程

    整个Android WiFi开发流程中,还包含了对Java、VM(虚拟机)、JNI(Java本地接口)和Android的网络框架的深入应用。Java代码通常用于编写高层的逻辑和UI交互,而JNI则用来在Java代码和本地代码之间进行桥接。例如,...

    非常基础的android入门教材

    4. **活动(Activity)管理**:详述Activity的生命周期,如何启动、切换和结束Activity,以及处理Activity之间的通信。 5. **意图(Intent)**:阐述Intent在应用程序间传递信息的作用,包括显式Intent和隐式Intent...

    Android_SIP_电话安全_研究.pdf

    根据提供的文件内容,以下是针对Android SIP电话安全研究的知识点详述: 1. 漏洞挖掘思想 在移动安全领域,漏洞挖掘是一项关键的技术活动。它要求安全研究者能够系统地识别软件中的安全缺陷,以及潜在的攻击路径。...

    Android 面试精华题目总结

    1、详述Android系统架构,包括层与层之间调用、binder、jni、底层文件读写方法 2、描述自己的一个项目,要求画出结构图,UML图,详细描述项目种的技术点,技术难点以及解决方案 3、一道算法 4、谈谈自己项目管理的...

    高德地图jar包和so库,含2D、3D地图2020最新版

    而"使用说明"则是一份文档,详述了如何配置项目、集成高德地图SDK、调用API以及处理各种事件的步骤和注意事项,对于初学者尤其有帮助。 集成高德地图API后,开发者可以实现以下功能: 1. **2D/3D地图显示**:展示...

Global site tag (gtag.js) - Google Analytics