这篇blog我们主要来介绍下chromium下content目录下的jni调用.
JNI调用主要分两块:
1. Java调cpp(cc)
2. Cc(cpp)调Java
现在,我们这里介绍Java调cc.
要实现java调用cc文件,要准备三个文件:cc文件、cc文件对应的头文件.h和java文件。
具体的写法,看下文的介绍吧。
在content目录下,我们可以参考ShellManager.java和shell_manager.cc文件。
1) Java文件
ShellManager.java中,有方法:
privatestatic native void nativeInit(Object shellManagerInstance);
2) cc文件:
shell_manager.cc文件,对应上面的方法是:
staticvoid Init(JNIEnv* env, jclass clazz, jobject obj)方法。
注意:static关键字不必对应,java是static,cc中未必是static,这个要看方法的具体使用;形参中前两个是JNIEnv* env,jclass clazz这个是固定的;之后的参数是根据java文件中的方法中的形参对应而来。关于java文件中数据的类型跟cc文件中数据类型的对应关系,可以上网搜搜。
3) cc文件:
在shell_manager.cc文件中,一个比较重要的方法是:
RegisterShellManager
如果,要想自己做一个cc文件,此方法必须要有。
在导入的头文件中,
#include"base/android/jni_android.h"
#include"base/android/jni_string.h"
#include"jni/ShellManager_jni.h"
是很重要。
注意:jni/ShellManager_jni.h文件是在out目录下,在执行gyp文件自动生成的。前面的ShellManager是java文件的名字。
如果,要想自己做一个cc文件,此三个头文件要导入,并且修改第三个头文件,ShellManager部分用java的名字代替。
4) 修改文件shell_jni_register.cc
该文件中,导入的文件有个:
#include"content/goblin/android/shell_manager.h"
如果,要是自己定义cc文件的话,要写这个文件的头文件,并且如上面导入。
.h文件的写法可以参考shell_manager.h文件的写法。
之后,在kShellRegistrationMethods数组中,参考内容:
{ "ShellManager",content::RegisterShellManager },
第一个参数是java的名字,ShellManager.java
第二个参数是shell_manager.cc文件的方法:RegisterShellManager,之前我们提到过。
如果要自己定义cc文件,则也要如上导入。
5) 修改gyp文件。我们这里修改的是content_shell.gypi文件。
修改位置一: 在target_name 是content_shell_jni_headers,中放置了ShellManger.java的路径。
如果要自己实现的话,也要仿照如此放置java文件。
修改位置二:在target_name是content_shell_lib的source中,导入了文件shell_manager.cc和shell_manager.h。
如果要自己实现的话,也要仿照如此放置cc文件。