测试版本Android Q ,platform 8321

第一步
为了在framework层测试,我们需要在增加一个java类供apk调用
新建文件夹mytest
frameworks/base/core/java/android/mytest/
新建文件hellojni.java
frameworks/base/core/java/android/mytest/hellojni.java
内容如下:
package android.mytest;
public class hellojni{
    public hellojni(){}
        //声明native方法
    public static native String displayString();
}

第二步
framework层新建cpp文件
通常情况下,jni存在的常见目录如下:
/framework/base/core/jni/  
/framework/base/services/core/jni/
/framework/base/media/jni/
我们在/framework/base/core/jni/ 新建cpp文件
frameworks/base/core/jni/com_mid_test_hellojni.cpp:
//
// Created by Administrator on 2019/10/16 0016.
//
#include "jni.h"
#define LOG_TAG "HelloJNI"  
#include
#include
#include "utils/misc.h"
#include

namespace android {
        static jstring android_mytest_hellojni_displayString(JNIEnv *env, jclass clazz)
        {
                return env->NewStringUTF("Hello from JNI!");
        }

        /* 
        * JNI registration. 
        */
        static JNINativeMethod gMethods[] = {
                /* name, signature, funcPtr */
                {"displayString", "()Ljava/lang/String;",
                        (void*) android_mytest_hellojni_displayString
                }

        };
        int register_android_mytest_hellojni(JNIEnv* env)
        { //此处的目录结构就是在Java framework层的文件目录,且必须一致  
                return jniRegisterNativeMethods(env, "android/mytest/hellojni",
                        gMethods, NELEM(gMethods));
        }
}; // namespace android  

com_mid_test_hellojni.cpp建好后需要动态加载:
--- a/frameworks/base/core/jni/AndroidRuntime.cpp
+++ b/frameworks/base/core/jni/AndroidRuntime.cpp
@@ -232,7 +232,7 @@ extern int register_com_android_internal_os_FuseAppLoop(JNIEnv* env);
 extern int register_com_android_internal_os_Zygote(JNIEnv *env);
 extern int register_com_android_internal_os_ZygoteInit(JNIEnv *env);
 extern int register_com_android_internal_util_VirtualRefBasePtr(JNIEnv *env);
-
+extern int register_android_mytest_hellojni(JNIEnv* env); //kzh add for test hellojni
 // Namespace for Android Runtime flags applied during boot time.
 static const char* RUNTIME_NATIVE_BOOT_NAMESPACE = "runtime_native_boot";
 // Feature flag name to enable/disable generational garbage collection in ART's
@@ -1606,6 +1606,7 @@ static const RegJNIRec gRegJNI[] = {
     REG_JNI(register_com_android_internal_content_NativeLibraryHelper),
     REG_JNI(register_com_android_internal_os_AtomicDirectory),
     REG_JNI(register_com_android_internal_os_FuseAppLoop),
+ REG_JNI(register_android_mytest_hellojni), //kzh add for test hellojni
 };
最后将com_mid_test_hellojni.cpp添加到makefile中build,
--- a/frameworks/base/core/jni/Android.bp
+++ b/frameworks/base/core/jni/Android.bp
@@ -214,6 +214,7 @@ cc_library_shared {
         "fd_utils.cpp",
         "android_hardware_input_InputWindowHandle.cpp",
         "android_hardware_input_InputApplicationHandle.cpp",
+ "com_mid_test_hellojni.cpp",
     ],
 
     include_dirs: [

测试验证,在任意一个system app中(第三方apk也可以,当然需要对应的jar包)测试

在某个Activity中加入一个log调用:

Log.d("jnitest",hellojni.displayString());

最后build整个project烧入设备开机验证。。。。。
 

更多相关文章

  1. 在Android应用中读取彩信文件
  2. android如何给apk重新签名
  3. Android(安卓)7.0 FileProvider 的那些坑
  4. Android(安卓)APK系列3-------使用platform密钥来给apk文件签名
  5. Android之简单文件管理器
  6. 谷歌开发工具Android(安卓)Studio安装使用图文教程
  7. 学习Android(安卓)Studio开发工具之Activity3(框架3)
  8. Dalvik 和 ART
  9. android logger的使用

随机推荐

  1. android装逼技术之暗码小DOME
  2. Android(安卓)自定义控件布局 NullPointe
  3. Android(安卓)Studio 提示与技巧(官方文档
  4. Android中px, dp, sp单位转换
  5. android 顶部Tab实现及原理
  6. 关于houdini技术和android x86平台兼容性
  7. 学习OpenGL ES for Android(十三)— 投光物
  8. 一场针对手机底层的新圈地运动(程苓峰)
  9. Android老矣,尚能饭否?即将步入2020年的你
  10. Android(安卓)主流开源框架(二)OkHttp 使用