- 浏览: 64568 次
- 性别:
- 来自: 北京
-
文章分类
Android JNI
编程实践
一、直接使用java
本身jni
接口(windows/ubuntu
)
1.
在Eclipsh
中新建一个android
应用程序。两个类:一个继承于Activity
,UI
显示用。另一个包含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.
将相应的动态库文件push
到avd
的system/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.81
和awk
)。若有错,修改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.mk
和myjni.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
文件也可采用一中的方法push
到avd
中运行。
发表评论
-
Unable to get buffer of resource asset file
2010-07-13 19:17 1910Problems When building you m ... -
Android JNI详述(一)
2010-07-13 17:41 2304Android JNI 知识简介 ... -
编译Android donut
2010-07-12 20:05 1766编译 Android 代码 ... -
Cupcake编译指导
2010-07-12 19:48 1259Cupcake 编译指导 准备文件: ... -
ubuntu samba配置
2010-07-12 14:22 1975ubuntu samba配置 关键字: ubuntu sam ... -
ubuntu下挂载android sdcard
2010-06-30 10:56 2577挂载SDCAED 1. 到SDK目录 cd ~/andro ... -
android文件系统结构及其引导过程初步理解(转载)
2010-06-28 17:16 14751、android文件系统的结 ... -
查看android目录结构
2010-06-28 17:12 5221环境:ubuntu10.04 android2.1 启动a ... -
Android Tools
2010-06-24 09:55 2873aapt(Android asset packaging t ... -
下载编译android kernel
2010-06-24 09:13 9843在ubuntu10.04中用git和repo ... -
ubuntu10.04下make android1.5
2010-06-22 16:55 5694Ubuntu10.04编译android1.5源码出错问题解决 ... -
CUPCAKE 编译(转)
2010-06-22 14:29 1253<!-- @pa ... -
Git和Repo扫盲——如何取得Android源代码(转)
2010-06-22 14:25 2513<!-- @pa ... -
android源代码编译(转)
2010-06-22 14:18 1277编译Android过程 建立编译环境, Ubuntu版 ... -
ubuntu下安装android
2010-06-22 14:14 2014<!-- @pa ...
相关推荐
- **官方文档**:Oracle提供的官方JNI规范,详述所有接口和功能。 - **最佳实践**:关于编写高效、安全和可维护的JNI代码的建议。 - **案例研究**:实际应用中的JNI实现,例如与图形库、音频处理库或其他系统服务...
在Android应用中使用PCL时,通常会通过NDK将PCL库编译为本地库,然后在Java层通过JNI(Java Native Interface)调用。 关于如何在Android项目中集成PCL-android-180-build.zip,通常需要以下步骤: 1. 解压下载的...
本书的核心内容涵盖了Android框架层的关键组件和技术,包括Activity管理、Intent机制、Service运行机制、BroadcastReceiver、ContentProvider、View系统以及JNI开发等方面。 1. **Activity管理**:Activity是...
#### 二、JNI调用讲解 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。在Android应用开发中,JNI主要用于实现性能要求较高的部分,例如图形处理、音频解码等,...
11. **Android NDK与JNI** 对于需要使用C++代码或调用原生库的开发者,NDK和JNI提供了在Java与C/C++之间交互的接口。文档中详细介绍了如何使用它们。 12. **测试与调试** Android提供了强大的测试框架,包括单元...
1. **Android系统服务**:详述系统服务的运行和管理,如电源管理、位置服务等。 2. **多媒体支持**:解析音频、视频的处理以及相机API的使用。 3. **图形与渲染**:探讨OpenGL ES、SurfaceFlinger和硬件加速技术。 4...
6. **集成到Android项目**:将生成的头文件和库文件添加到Android项目的jniLibs目录下,根据不同的ABI(armeabi-v7a, arm64-v8a, x86, x86_64等)放入对应的子目录。然后在Android Studio的CMake配置中引入头文件和...
4. **Android原生API集成**:探讨如何使用Java本地接口(JNI)调用Android原生API,实现Qt应用与Android系统的深度集成,如访问硬件设备、使用系统服务等。 5. **性能优化**:分享提高Qt on Android应用性能的技巧...
5. **系统编译与定制**:详述如何从源代码编译Android系统,以及如何根据需求定制系统,包括修改启动器、主题、内核和其他核心组件。 6. **签名与加密**:介绍Android应用的签名机制,以及如何使用数字证书来验证...
为了充分利用NDK19.2,开发者需要熟悉C/C++编程,了解JNI原理,并掌握Android Studio的相关配置。同时,需要注意的是,虽然NDK提供了性能优势,但过度使用原生代码也可能增加应用的复杂性和体积,因此在使用时需权衡...
4. **在Android系统中编写JNI方法**:利用JNI(Java Native Interface)实现Java代码与C/C++代码的互操作,使得Java应用程序可以调用硬件驱动。 5. **在Android应用程序框架层增加硬件服务接口**:设计并实现框架层...
整个Android WiFi开发流程中,还包含了对Java、VM(虚拟机)、JNI(Java本地接口)和Android的网络框架的深入应用。Java代码通常用于编写高层的逻辑和UI交互,而JNI则用来在Java代码和本地代码之间进行桥接。例如,...
4. **活动(Activity)管理**:详述Activity的生命周期,如何启动、切换和结束Activity,以及处理Activity之间的通信。 5. **意图(Intent)**:阐述Intent在应用程序间传递信息的作用,包括显式Intent和隐式Intent...
根据提供的文件内容,以下是针对Android SIP电话安全研究的知识点详述: 1. 漏洞挖掘思想 在移动安全领域,漏洞挖掘是一项关键的技术活动。它要求安全研究者能够系统地识别软件中的安全缺陷,以及潜在的攻击路径。...
1、详述Android系统架构,包括层与层之间调用、binder、jni、底层文件读写方法 2、描述自己的一个项目,要求画出结构图,UML图,详细描述项目种的技术点,技术难点以及解决方案 3、一道算法 4、谈谈自己项目管理的...
而"使用说明"则是一份文档,详述了如何配置项目、集成高德地图SDK、调用API以及处理各种事件的步骤和注意事项,对于初学者尤其有帮助。 集成高德地图API后,开发者可以实现以下功能: 1. **2D/3D地图显示**:展示...