android C++和Java通过JNI机制相互调用
来源:互联网 发布:服装erp软件 编辑:程序博客网 时间:2024/06/09 14:49
上篇文章添加了一个自定义的系统服务,并且可以获取使用该服务。这篇文章在上篇文章的基础上,
利用JNI机制实现该系统服务对应的C++文件,本篇文章基于android 6.0。
目标:
1,java通过JNI机制可以调用C++中的方法
2,C++调用java中的方法
1, MyService创建方法
frameworks/base/services/core/java/com/android/server/路径下的MyService.java如下,
package com.android.server;import android.os.IMyService;import android.util.Log;class MyService extends IMyService.Stub { private String myName ; private String myCName ; public MyService(){ } @Override public void setName(String mname){ myName = mname; } @Override public String getName(){ getNameNative(); return myCName; } public void getCName(String str){ myCName = myName + " C_Java " + str; Log.d("android ", "myCName: " + myCName); } public native void ();}
新添加一个getNameNative方法,调用对应的C++的getNameNative方法。
新添加一个getCName方法,供C++的进行调用。
2,添加对应的C++文件
1,在frameworks/base/services/core/jni路径下添加com_android_server_MyService.cpp文件,主要内容如下,
namespace android{static void getNameNative(JNIEnv *env, jobject object) { //调用 LOGI("native getNameNative"); jclass clazz = env->FindClass("com/android/server/MyService"); jmethodID methodID = env->GetMethodID(clazz, "getCName", "(Ljava/lang/String;)V");env->CallVoidMethod(object,methodID,env->NewStringUTF(" Java_C is successed"));}static JNINativeMethod sMethods[] = {{"getNameNative", "()V", (void*)getNameNative}, };int register_android_server_MyService(JNIEnv* env) //注册{ LOGI("register_android_server_MyService"); return jniRegisterNativeMethods(env, "com/android/server/MyService", sMethods, NELEM(sMethods));}}
2,在frameworks/base/services/core/jni路径下Android.mk文件LOCAL_SRC_FILES中添加如下内容,
LOCAL_SRC_FILES += \•••$(LOCAL_REL_DIR)/com_android_server_MyService.cpp \•••
3,frameworks/base/services/core/jni路径下的onload.cpp文件中,
在namespace android 中最后添加
int register_android_server_MyService(JNIEnv* env);
在extern "C" jintJNI_OnLoad(JavaVM* vm, void* /* reserved */)中添加
register_android_server_MyService(env);
当然这些文件的路径根据实际情况有所不同。
3,代码分析
在apk中,
mMyServiceManager = (MyServiceManager)getSystemService("MyService");mMyServiceManager.setName("my_stystem_service");Log.d("android " , "getName" + mMyServiceManager.getName());
最后输出:
my_stystem_service C_Java Java_C is successed
调用的逻辑如下,
1,首先调用系统服务MyService的getName方法。
2,系统服务MyService通过JNI机制调用com_android_server_MyService.cpp的getNameNative方法。
3,在com_android_server_MyService.cpp的getNameNative方法中调用系统服务MyService的getCName方法为变量myCName赋值。
4,最后返回系统服务MyService的变量myCName。
- android C++和Java通过JNI机制相互调用
- java与C/C++之间通过jni相互调用
- 通过JNI实现Java和C++的相互调用
- 通过JNI实现Java和C++的相互调用
- 通过JNI实现Java和C++的相互调用
- 通过JNI实现Java和C++的相互调用
- 通过JNI实现Java和C++的相互调用
- Android C 通过JNI 调用JAVA
- JNI编程 —— 让C 和Java相互调用 - android - 牛蹄印章
- Android NDK环境搭建及JNI开发java和C的相互调用的基本介绍
- android-JNI学习之java和c++相互调用
- android-JNI学习之java和c++相互调用
- Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用
- Android开发 通过JNI实现JAVA与C/C++程序间的调用和回调
- android jni C++ java 相互调用
- Android JNI 通过C/C++调用JAVA方法
- 在Android中,通过JNI实现C++与Java相互调用
- Android JNI C调用Java
- 机器学习算法与Python实践之k近邻(KNN)
- spring中ApplicationListener源码分析
- LeetCode刷题(C++)——Merge Two Sorted Lists(Easy)
- 关于HBuilder在云端打包和本地手机运行效果不同的问题
- 《EAGRE: Towards scalable I/O efficient SPARQL query evaluation on the cloud》——论文笔记
- android C++和Java通过JNI机制相互调用
- 1005. Spell It Right (20)[C语言]
- bzoj 2751: [HAOI2012]容易题(easy) 数学
- Python 3基础教程25-异常处理
- 记一次Redis设置主从复制时遇到的问题
- [leetcode]557. Reverse Words in a String III
- 用友 uap nc65开发中的查询模版源代码讲解
- Leetcode-Two Sum
- Python Notes (7)