- 浏览: 44881 次
- 性别:
- 来自: 济南
-
文章分类
最新评论
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 6961、获取资源: 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 1010LayoutParams 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 7111.drawable-(hdpi,mdpi,ldpi)的区别 ... -
Android如何将程序打成jar包
2012-10-15 10:04 0导出 1. 创建java project 2. 工程属性jav ... -
android Activity背景风格
2012-10-16 12:23 622Android Theme主题样式开发注意点 Androi ... -
ANR处理方法
2012-10-15 10:00 0ANRs (“Application Not Respondi ...
相关推荐
如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以及第一个jni调用程序 ,串口通信和java操作io类似,先打开串口,然后向串口发送或者读取数据,最后关闭...
- 通过JNI调用机制实现Java层与C/C++层之间的数据交换。 ##### 2.2 示例代码 假设在Java层定义了一个方法`turnOnLed`: ```java public class LedControl { static { System.loadLibrary("ledtest"); // 加载...
3. 编写代码:在Java源代码中实现应用的功能,调用Android提供的API。 4. 测试调试:使用模拟器或连接真实设备进行测试,Eclipse内置调试工具可帮助查找和修复问题。 5. 打包发布:最终将应用打包成APK文件,通过...
首先,说明.txt文件可能包含了作者在学习过程中的一些心得、技巧或者案例概述。在逆向工程中,理解代码逻辑、跟踪函数调用、识别加密算法等都是关键技能。作者可能会分享如何使用工具如dex2jar、JD-GUI来将Dalvik...
11. **系统调用和JNI**:Java Native Interface(JNI)允许Java代码和其他语言写的代码进行交互,理解JNI可以让你在需要高效计算或调用系统级功能时得心应手。 12. **编译构建系统**:AOSP的编译系统涉及Makefile、...
- **Android端开发问题**:通过基于JNI实现CSocket编程开发,解决了封装程度过高带来的限制。 - **编码问题**:考虑到PC端与移动设备之间的编码差异,进行了适当的转换处理。 - **多线程编程临界区问题**:采取了...