### JNI了解吗,Java与C++如何相互调用?
Java调用C++
1. 在Java中声明Native方法(即需要调用的本地方法)
2. 编译上述 Java源文件javac(得到 .class文件)
3。 通过 javah 命令导出JNI的头文件(.h文件)
4. 使用 Java需要交互的本地代码 实现在 Java中声明的Native方法
5. 编译.so库文件
6. 通过Java命令执行 Java程序,最终实现Java调用本地代码
C++调用Java
1. 从classpath路径下搜索ClassMethod这个类,并返回该类的Class对象。
2. 获取类的默认构造方法ID。
3. 查找实例方法的ID。
4. 创建该类的实例。
5. 调用对象的实例方法。
```c++
JNIEXPORT void JNICALL Java_com_study_jnilearn_AccessMethod_callJavaInstaceMethod
(JNIEnv *env, jclass cls)
{
jclass clazz = NULL;
jobject jobj = NULL;
jmethodID mid_construct = NULL;
jmethodID mid_instance = NULL;
jstring str_arg = NULL;
// 1、从classpath路径下搜索ClassMethod这个类,并返回该类的Class对象
clazz = (*env)->FindClass(env, "com/study/jnilearn/ClassMethod");
if (clazz == NULL) {
printf("找不到'com.study.jnilearn.ClassMethod'这个类");
return;
}
// 2、获取类的默认构造方法ID
mid_construct = (*env)->GetMethodID(env,clazz, "<init>","()V");
if (mid_construct == NULL) {
printf("找不到默认的构造方法");
return;
}
// 3、查找实例方法的ID
mid_instance = (*env)->GetMethodID(env, clazz, "callInstanceMethod", "(Ljava/lang/String;I)V");
if (mid_instance == NULL) {
return;
}
// 4、创建该类的实例
jobj = (*env)->NewObject(env,clazz,mid_construct);
if (jobj == NULL) {
printf("在com.study.jnilearn.ClassMethod类中找不到callInstanceMethod方法");
return;
}
// 5、调用对象的实例方法
str_arg = (*env)->NewStringUTF(env,"我是实例方法");
(*env)->CallVoidMethod(env,jobj,mid_instance,str_arg,200);
// 删除局部引用
(*env)->DeleteLocalRef(env,clazz);
(*env)->DeleteLocalRef(env,jobj);
(*env)->DeleteLocalRef(env,str_arg);
}
```
- Android面试题集
- Android系统架构图
- Activity与Service通信
- Service的生命周期与启动方法
- 广播
- ContentProvider、ContentResolver与ContentObserver之间的关系
- 关于Fragment的问题
- Android里的Intent传递的数据限制
- Android的事件分发机制
- View的绘制原理
- APK的打包流程
- BroadcastReceiver与LocalBroadcastReceiver
- Handler
- Android Binder机制
- Activity的生命周期
- Activity的通信方式
- Android应用里的Context对象
- 进程和Application的生命周期
- 内存泄漏
- Android的几种进程
- SharePreference性能优化
- SQLite升级
- 进程保护
- 序列化
- 计算一个Bitmap占用内存
- 内存缓存和磁盘缓存
- PathClassLoader与DexClassLoader
- WebView优化
- JNI
- 插件化和热修复
- 性能优化
- 防止过度绘制,做布局优化
- 提交代码质量
- 64k问题
- MVC、MVP与MVVM之间的对比分析
- Android中高级面试题
- Activity生命周期
- onStart()与onResume()有什么区别
- Activity启动流程
- Android类加载器
- Android消息机制
- Looper.loop()为什么不会阻塞主线程
- IdleHandler (闲时机制)
- 同步屏障机制(sync barrier)
- View的绘制原理
- 什么是MeasureSpec
- getWidth()方法和getMeasureWidth()区别
- requestLayout,invalidate,postInvalidate区别与联系
- Binder机制,共享内存实现原理
- 序列化的方式
- Fragment的懒加载实现
- RecyclerView与ListView(缓存原理,区别联系,优缺点)
- Android两种虚拟机区别与联系
- adb常用命令行
- apk打包流程
- apk安装流程
- apk瘦身
- HTTP缓存机制
- 组件化
- okhttp原理
- Retrofit的实现与原理
- RxLifecycle原理
- 类的加载机制
- 什么时候发生类初始化
- 双亲委派模型
- 为什么使用双亲委托模型
- HashMap原理,Hash冲突
- 什么是Fail-Fast机制
- Java多线程中调用wait() 和 sleep()方法有什么不同?
- volatile的作用和原理
- 一个int变量,用volatile修饰,多线程去操作++,线程安全吗?
- 那如何才能保证i++线程安全?
- CAS实现原子操作会出现什么问题?
- synchronized
- 偏向锁
- 轻量级锁
- 线程池
- 假如有n个网络线程,你需要当n个网络线程完成之后,再去做数据处理,你会怎么解决?
- Java中interrupted 和 isInterruptedd方法的区别?
- 懒汉式单例的同步问题
- 什么是ThreadLocal
- 什么是数据竞争
- Java内存模型(Java Memory Model JMM)
- Java内存区域
- 判断对象是否需要回收的方法
- 引用类型
- 垃圾收集算法
- 内存分配策略