- 浏览: 43568 次
- 性别:
- 来自: 济南
文章分类
最新评论
jni 的调用分几种方式:
1。静态调用
2。动态调用
动态调用就是,平时说的,在项目中新建jni目标,用NDK方法来编译。最终生成so文件借当前项目需要的时候,调用
静态调用就是开机的时候加载到虚拟机里面的方式,这里也分两种方式,
1。同样Simplejni 路径:/rowboat-android/development/samples/SimpleJNI
从这个例子可以看出,这种方式调用是,采用封装好的形式,加载到虚拟机里面去,然后调用的方式也区别于ndk,因为方法名前面不用加包名
2。另外一个是把.cpp文件放在framework下面,来保证开机加载到虚拟机里面去,文件存放目录为:rowboat-android/frameworks/base/core/jni
在这个目录下面也有类似的例子,如:
android_os_Power.cpp
static void releaseWakeLock(JNIEnv *env, jobject clazz, jstring idObj)
{
if (idObj == NULL) {
throw_NullPointerException(env, "id is null");
return ;
}
const char *id = env->GetStringUTFChars(idObj, NULL);
release_wake_lock(id);
env->ReleaseStringUTFChars(idObj, id);
}
把定义的方法加载到方法列表当中
static JNINativeMethod method_table[] = {
{ "acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock },
{ "releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock },
{ "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout },
{ "setScreenState", "(Z)I", (void*)setScreenState },
{ "shutdown", "()V", (void*)android_os_Power_shutdown },
{ "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
{ "VirtualKey", "()V", (void*)android_os_Power_VirtualKey },
{ "sendKye", "()V", (void*)android_os_Power_sendKey },
};
//注册所有方法到虚拟机
int register_android_os_Power(JNIEnv *env)
{
return AndroidRuntime::registerNativeMethods(
env, "android/os/Power",
method_table, NELEM(method_table));
}
//AndroidRuntime.cpp
extern int register_android_os_Power(JNIEnv *env);
REG_JNI(register_android_os_Power),
在这里增加到总的虚拟机上面,方便统一加载
在这个文件当中完成统一的开机,虚拟机统一加载 。。。。。。
如果 是这种方式调用,那么在程序当中只要直接调用方法名就行了,不需要像NDK 那样System.loadLibrary("demo");
1。静态调用
2。动态调用
动态调用就是,平时说的,在项目中新建jni目标,用NDK方法来编译。最终生成so文件借当前项目需要的时候,调用
静态调用就是开机的时候加载到虚拟机里面的方式,这里也分两种方式,
1。同样Simplejni 路径:/rowboat-android/development/samples/SimpleJNI
从这个例子可以看出,这种方式调用是,采用封装好的形式,加载到虚拟机里面去,然后调用的方式也区别于ndk,因为方法名前面不用加包名
2。另外一个是把.cpp文件放在framework下面,来保证开机加载到虚拟机里面去,文件存放目录为:rowboat-android/frameworks/base/core/jni
在这个目录下面也有类似的例子,如:
android_os_Power.cpp
static void releaseWakeLock(JNIEnv *env, jobject clazz, jstring idObj)
{
if (idObj == NULL) {
throw_NullPointerException(env, "id is null");
return ;
}
const char *id = env->GetStringUTFChars(idObj, NULL);
release_wake_lock(id);
env->ReleaseStringUTFChars(idObj, id);
}
把定义的方法加载到方法列表当中
static JNINativeMethod method_table[] = {
{ "acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock },
{ "releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock },
{ "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout },
{ "setScreenState", "(Z)I", (void*)setScreenState },
{ "shutdown", "()V", (void*)android_os_Power_shutdown },
{ "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
{ "VirtualKey", "()V", (void*)android_os_Power_VirtualKey },
{ "sendKye", "()V", (void*)android_os_Power_sendKey },
};
//注册所有方法到虚拟机
int register_android_os_Power(JNIEnv *env)
{
return AndroidRuntime::registerNativeMethods(
env, "android/os/Power",
method_table, NELEM(method_table));
}
//AndroidRuntime.cpp
extern int register_android_os_Power(JNIEnv *env);
REG_JNI(register_android_os_Power),
在这里增加到总的虚拟机上面,方便统一加载
在这个文件当中完成统一的开机,虚拟机统一加载 。。。。。。
如果 是这种方式调用,那么在程序当中只要直接调用方法名就行了,不需要像NDK 那样System.loadLibrary("demo");
发表评论
-
[Android分享] Preferencescreen关于intent跳转activity问题。
2012-10-15 10:16 0这几天在做setting,遇到配置好intent后点击没有反应 ... -
TabHost技巧
2012-10-15 10:16 01.如何要在tabhost 中显示activity ,那么里面 ... -
后台的Activity被系统回收怎么办:onSaveInstanceState
2012-10-15 10:15 0你后台的Activity被系统回收怎么办:onSaveInst ... -
ctwap-cmwap-uiwap网络连接
2012-10-15 10:15 0if (localNetworkInfo != n ... -
显示、隐藏软键盘
2012-10-15 10:14 0一、 // Hide soft keyboard, if vi ... -
Android---常用方法
2012-10-16 12:24 6651、获取资源: Resources ... -
动态更新Menu状态的方法
2012-10-15 10:13 0@Override public boolean onCre ... -
android 获取 imei号码
2012-10-15 10:13 0android 获取 imei号码 Imei = ((Tel ... -
Tools之Traceview使用
2012-10-15 10:12 0一.产生Trace文件 import android.os.D ... -
textview 滚动代码
2012-10-15 10:12 0android:singleLine="true&q ... -
android 获取xml控件的长度
2012-10-16 12:24 967LayoutParams tvPara = (LayoutPa ... -
android编译
2012-10-15 10:10 0境:ubuntu10.04 1.安装java 下载jdk-1_ ... -
一些比较实用的方法
2012-10-15 10:09 0//获取系统时间格式的方法 boolean b24 = Dat ... -
android Task 与 Activity的关系
2012-10-15 10:09 0android:noHistory 用于标记当用户从A ... -
android滑动之Scrolle
2012-10-15 10:08 0正文 一、结构 public class Scroller e ... -
启动其它应用包的方法
2012-10-15 10:06 0Intent mainIntent = new Intent( ... -
Android开发中的drawable-(hdpi,mdpi,ldpi)和WVGA,HVGA,QVGA的区别以及联系
2012-10-16 12:24 6901.drawable-(hdpi,mdpi,ldpi)的区别 ... -
Android如何将程序打成jar包
2012-10-15 10:04 0导出 1. 创建java project 2. 工程属性jav ... -
android Activity背景风格
2012-10-16 12:23 585Android Theme主题样式开发注意点 Androi ... -
ANR处理方法
2012-10-15 10:00 0ANRs (“Application Not Respondi ...
相关推荐
Android 通过 JNI 调用.so 动态库 Android 通过 JNI(Java Native Interface)调用.so 动态库是 Android 开发中的一种常用技术。JNI 是一种允许 Java 代码与 native 代码之间进行交互的接口。通过 JNI,我们可以在 ...
在这个特殊的场景中,我们讨论的是如何通过JNI在Android应用中调用Python解释器,这通常用于实现动态脚本执行或者利用Python丰富的库资源。 首先,我们需要理解Android的NDK(Native Development Kit),它是...
Android的JNI(Java Native Interface)调用是Android应用开发中的一个重要技术,允许Java代码与本地C/C++代码交互。在Android NDK(Native Development Kit)的帮助下,开发者可以利用C/C++的强大性能处理复杂的...
本教程将详细介绍如何在Android项目中使用JNI调用C++代码。 首先,你需要配置Android的NDK(Native Development Kit)。NDK是一组工具,开发者可以用它来编写用C和C++编写的应用程序模块,这些模块可以直接在...
Android JNI(Java Native Interface)是Android系统提供的一种机制,它允许Java代码调用C/C++原生代码,同时也允许C/C++代码调用Java的方法。JNI在开发高性能、低级硬件交互、使用现有C库或者优化性能的关键部分时...
本篇文章将深入探讨如何在Android中使用JNI以及如何在JNI层调用方法。 1. **JNI基本概念** - JNI是一种接口,让Java应用程序能够调用本地(非Java)代码,同时也允许本地代码调用Java方法。 - 在Android中,JNI...
在Android应用程序开发中,有时需要访问底层硬件功能或者优化性能,这时就可能需要用到JNI(Java Native Interface)技术来调用C/C++代码。JNI允许Java应用程序与本地代码进行交互,包括操作系统内核、驱动程序等。...
这个例子"android studio中JNI调用第三方库例子"是基于谷歌官方提供的"hello-libs"示例项目,旨在帮助开发者了解如何在Android Studio中使用JNI来调用预编译的第三方动态链接库(.so文件)。 首先,我们需要理解JNI...
### Android JNI调用详解 #### 一、简介与环境配置 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。对于Android开发来说,使用JNI可以实现用C/C++来编写性能...
在Android Jni调用实例中,我们通常会经历以下几个步骤: 1. **创建本地方法声明**:在Java层,我们需要声明一个native方法,该方法将在C/C++代码中实现。例如: ```java public class NativeDemo { static { ...
本示例"Android Studio JNI 调用demo"将展示如何在Android Studio中创建、编译JNI代码,并在Android应用中加载和调用本地库(SO文件)。 1. **JNI基础知识** JNI是Java平台的标准组成部分,它定义了一组API,让...
通过上述步骤,我们可以成功地在Android应用中实现JNI调用,充分利用C/C++的性能优势,同时保持Java的易用性和跨平台性。不过,需要注意的是,过度使用JNI可能导致代码维护困难,因此应当谨慎权衡利弊。
总结起来,Android中的JNI调用允许开发者使用C/C++进行文件操作,提供更高的效率和灵活性。通过声明native方法、编写C/C++代码、配置构建系统以及处理权限,开发者可以充分利用JNI进行复杂或性能敏感的文件操作。...
本项目"JniDemo Android调用C语言"提供了一个完整的示例,展示了如何在Android Studio环境中利用JNI调用C语言代码。 首先,我们来理解一下JNI的基本概念。JNI是Java虚拟机(JVM)和本地代码之间的桥梁,它定义了一...
这个“Android 5.0 JNI调用”示例可能就是为了展示这些改进而设计的。 JNI的核心功能是为Java应用提供访问本地库(如C/C++代码)的能力。在Android 5.0之前,JNI调用可能存在一些问题,比如内存管理不当可能导致...
Android JNI调用是Android应用程序开发中的一个重要组成部分,它允许开发者在Java代码中调用本地(C/C++)代码,从而实现高效能计算、利用现有的C/C++库或处理硬件特定的功能。JNI,全称为Java Native Interface,是...
本文将深入探讨在Android中如何使用JNI,特别是如何从C++ native代码调用Java层的类、方法、属性以及接口,同时涉及线程回调接口的实现。 首先,我们需要了解JNI的基本结构。一个典型的JNI应用会包含Java源文件、C/...
本教程将深入讲解Android的JNI与底层C代码调用的开发过程。 首先,我们要了解JNI的基本概念。JNI是Java平台标准的一部分,它提供了一种方式,使得Java代码能够调用本地(非Java)代码,反之亦然。这使得开发者可以...
总之,Android JNI调用Silk音频编解码包涉及到Android NDK的使用,JNI接口的创建,以及与Android音频系统的集成。通过这一过程,你可以充分利用Silk编解码器的性能优势,为你的应用提供高质量的音频处理功能。
AndroidStudio环境下的jni调用(NDK),这个教程可以让完全不会AndroidStudio的人学会jni调用。完全步骤话,非常简单。