惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Securelist
O
OpenAI News
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Google Online Security Blog
Google Online Security Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
N
News and Events Feed by Topic
S
Security Affairs
SecWiki News
SecWiki News
Project Zero
Project Zero
L
Lohrmann on Cybersecurity
P
Proofpoint News Feed
P
Palo Alto Networks Blog
L
LINUX DO - 最新话题
H
Hacker News: Front Page
Recent Commits to openclaw:main
Recent Commits to openclaw:main
I
Intezer
Simon Willison's Weblog
Simon Willison's Weblog
W
WeLiveSecurity
T
The Exploit Database - CXSecurity.com
K
Kaspersky official blog
The GitHub Blog
The GitHub Blog
I
InfoQ
云风的 BLOG
云风的 BLOG
雷峰网
雷峰网
B
Blog
IT之家
IT之家
AWS News Blog
AWS News Blog
Jina AI
Jina AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Google DeepMind News
Google DeepMind News
Spread Privacy
Spread Privacy
N
News and Events Feed by Topic
Security Latest
Security Latest
美团技术团队
C
Check Point Blog
WordPress大学
WordPress大学
T
Tenable Blog
S
Security @ Cisco Blogs
Last Week in AI
Last Week in AI
博客园 - 聂微东
月光博客
月光博客
博客园 - 【当耐特】
S
Schneier on Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Secure Thoughts
Schneier on Security
Schneier on Security
C
Cisco Blogs
Cyberwarzone
Cyberwarzone

博客园 - 星辰之力

网站工具 Vue项目用于Ios和Android端开发 Android assets文件夹之位置放置和作用 轻松搭建Xposed Hook cordov vue项目中调用手机原生api Android 直接修改dex破解 Android 逆向实战篇(加密数据包破解) Android JNI中C调用Java方法 Android Studio NDK JNI动态注册本地方法 JNI C反射调用java方法 JNI NDK (AndroidStudio+CMake )实现C C++调用Java代码流程 Jni 线程JNIEnv,JavaVM,JNI_OnLoad(GetEnv返回NULL?FindClass返回NULL?) Jni OnLoad()和OnUnload() Android JNI之C/C++层调用JAVA Android NDK编译之undefined reference to 'JNI_CreateJavaVM' Android JNI c/c++调用java 无需新建虚拟机 cmake:善用find_package()提高效率暨查找JNI支持 如何解决用CMake未定义引用`JNI_CreateJavaVM'? [Linker error] undefined reference to `_imp__JNI_CreateJavaVM@12'
Android 开创java世界(JNI Invocation API)
星辰之力 · 2019-03-27 · via 博客园 - 星辰之力

在Android的世界中,由名称为app_process的C++本地应用程序(路径为:framework/base/cmds/app_process/app_main.cpp)调用JNI Invocation API 在自身进程中加载dalvikvm虚拟机,这样就开创了java世界.

  现在就简单的Demo一下这个原理,在Ubuntu11.10的终端中操作,已安装了jdk的条件。

1.首先创建一个工作目录:

2.创建一个java文件,Called.java,内容:

public class Called  
{  
    public static void main(String[] args)  
    {  
     // 把参数打印出来  
    System.out.println(args[0]);  
  
    }  
}  

3.编译这个java文件为class文件:

生成的Called.class就在当前目录下。

4.编写本地的C/C++程序,此处以C为例,名字为:invocationApi.c

#include <jni.h>       /* where everything is defined */  
  
int main()  
{  
    JavaVM *vm;       /* denotes a Java VM */  
    JNIEnv *env;       /* pointer to native method interface */  
    JavaVMInitArgs vm_args; /* JDK 6 VM initialization arguments */  
    JavaVMOption* options = new JavaVMOption[1];  
    //options[0].optionString = "-Djava.class.path=/usr/lib/java";  
    options[0].optionString = "-Djava.class.path=/home/joy/android4.0.3/external/javaVMTest";  
    vm_args.version = JNI_VERSION_1_6;  
    vm_args.nOptions = 1;  
    vm_args.options = options;  
    vm_args.ignoreUnrecognized = false;  
  
  
  
    /* load and initialize a Java VM, return a JNI interface  
     * pointer in env */  
    JNI_CreateJavaVM(&vm, (void**)&env, &vm_args);  
    //delete options;  
      
    jclass cls = (*env).FindClass("Called");  
    //printf("%p  %d %d\n",cls,size,a);  
    printf("%p \n",cls);  
    jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");  
  
    jstring jstr = env->NewStringUTF("Hello JNI Invocation API !!!");  
    jclass stringClass = env->FindClass("java/lang/String");  
    jobjectArray args = env->NewObjectArray(1,stringClass,jstr);  
  
    env->CallStaticVoidMethod(cls, mid, args);  
  
  
    /* We are done. */  
    vm->DestroyJavaVM();  
  
    return 0;  
}  

5.编译这个c文件,先要找到jdk的位置:

这样jdk的位置就能找到了,一般都在/usr/lib/jvm下

这里就用/usr/lib/jvm/java-6-sun-1.6.0.16/来代替了。

6.找到libjvm.so这个东东是关键。

   一般都在jdk路径下面的:/jre/lib/amd64/server或者是什么i386等等的,
   用find -name "libjvm.so"能很快找到。

7.配置编译时连接库:

在当前终端中,执行:

  export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-sun-1.6.0.16 /jre/lib/amd64/server

8.执行编译命令:

   g++ -I /usr/lib/jvm/java-6-sun-1.6.0.16 /include -I /usr/lib/jvm/java-6-sun-1.6.0.16 /include/linux -ljvm -L/usr/lib/jvm/java-6-sun-1.6.0.16 /jre/lib/amd64/server invocationApi.c

9.运行结果:

 运行编译出的a.out:

  如果正常情况下结果为:

joy@joy-top:~/android4.0.3/external/javaVMTest$ ./a.out 
Hello JNI Invocation API !!!
joy@joy-top:~/android4.0.3/external/javaVMTest$