`

android jni调用心得

 
阅读更多
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");
分享到:
评论

相关推荐

    Android串口开发之使用JNI实现ANDROID和串口通信详解

    如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以及第一个jni调用程序 ,串口通信和java操作io类似,先打开串口,然后向串口发送或者读取数据,最后关闭...

    android从HAL,jni,到app学习心得,绝对原创

    - 通过JNI调用机制实现Java层与C/C++层之间的数据交换。 ##### 2.2 示例代码 假设在Java层定义了一个方法`turnOnLed`: ```java public class LedControl { static { System.loadLibrary("ledtest"); // 加载...

    Henry-Android开发心得.docHenry-Android开发心得.doc

    3. 编写代码:在Java源代码中实现应用的功能,调用Android提供的API。 4. 测试调试:使用模拟器或连接真实设备进行测试,Eclipse内置调试工具可帮助查找和修复问题。 5. 打包发布:最终将应用打包成APK文件,通过...

    记录一些我自己在学习Android逆向过程中的有意思的东西.zip

    首先,说明.txt文件可能包含了作者在学习过程中的一些心得、技巧或者案例概述。在逆向工程中,理解代码逻辑、跟踪函数调用、识别加密算法等都是关键技能。作者可能会分享如何使用工具如dex2jar、JD-GUI来将Dalvik...

    BlogForZFB.zip

    11. **系统调用和JNI**:Java Native Interface(JNI)允许Java代码和其他语言写的代码进行交互,理解JNI可以让你在需要高效计算或调用系统级功能时得心应手。 12. **编译构建系统**:AOSP的编译系统涉及Makefile、...

    同一子网下文件互传及共享-网络编程结课报告.docx

    - **Android端开发问题**:通过基于JNI实现CSocket编程开发,解决了封装程度过高带来的限制。 - **编码问题**:考虑到PC端与移动设备之间的编码差异,进行了适当的转换处理。 - **多线程编程临界区问题**:采取了...

Global site tag (gtag.js) - Google Analytics