ChromiumJniGenerator - Jni Generator module extracted from Chromium project

Overview

How to use the ChromiumJniGenerator

1 Dependencies

1.1 C ++ dependencies

Copy two directories: chromium-jni-generator-native-essential and chromium-jni-generator-native-gen-script to your project pic1 The chromium-jni-generator-neutral-essential directory contains the chromium_jni_generator_native_essential .h and chromium_jni_generator_native_essential.cc pic2 The chromium-jni-generator-native-gen-script directory contains python scripts that generate native code pic3 chromium_native_code_gen.sh is an example of using python scripts to generate native code

#!/bin/bash

#create code generation directories
rm -rf ./gen
mkdir -p gen/cpp
mkdir -p gen/java

#generate native code
./jni_generator.py --input_file XXXXA.java --input_file XXXXB.java --output_file gen/cpp/XXXXA.h --output_file gen/cpp/XXXXB.h

1.2 Java dependencies

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
dependencies {
    compileOnly 'com.github.allenxuan.ChromiumJniGenerator:chromium-jni-generator-jvm-annotations:v1.0.0'
    kapt 'com.github.allenxuan.ChromiumJniGenerator:chromium-jni-generator-jvm-compiler:v1.0.0'
}

2 Java Layer Access C/C ++ Layer ( JNI )

Define native functions in the Java layer

`ChromiumJniTestA.java`

@JNINamespace("test::your::name::space")
public class ChromiumJniTestA {
//Work
public static native boolean nativeFunctionAA(boolean param1, float param2);

    //Not work. "static" should be put in front of "native".
    public native static boolean nativeFunctionAB(boolean param1, float param2);

    //Work
    public native long nativeFunctionAC(String param1);

    //Not work. The function name should starts with "native".
    public native long functionAD(String param1);
}

Or define native methods with @NativeMethods annotations

`ChromiumJniTestB.java`

@JNINamespace("test::your::name::space")
public class ChromiumJniTestB {
@NativeMethods
interface Natives {
boolean nativeFunctionBA(boolean param1, float param2);

        float functionBB(String param1);
    }
}

Java Annotation Processor generates auxiliary classes ChromiumJniTestBJni.java and GEN_JNI.java from @NativeMethods

`ChromiumJniTestBJni.java`

class ChromiumJniTestBJni implements ChromiumJniTestB.Natives {
  @Override
  public boolean nativeFunctionBA(boolean param1, float param2) {
    return (boolean)GEN_JNI.org_chromium_chromiumjnigenerator_ChromiumJniTestB_nativeFunctionBA(param1, param2);
  }

  @Override
  public float functionBB(String param1) {
    return (float)GEN_JNI.org_chromium_chromiumjnigenerator_ChromiumJniTestB_functionBB(param1);
  }

  public static ChromiumJniTestB.Natives get() {
    return new ChromiumJniTestBJni();
  }
}
`GEN_JNI.java`

public final class GEN_JNI {

  /**
   * org.chromium.chromiumjnigenerator.ChromiumJniTestB.functionBB
   * @param param1 (java.lang.String)
   * @return (float)
   */
  public static final native float org_chromium_chromiumjnigenerator_ChromiumJniTestB_functionBB(
      String param1);

  /**
   * org.chromium.chromiumjnigenerator.ChromiumJniTestB.nativeFunctionBA
   * @param param1 (boolean)
   * @param param2 (float)
   * @return (boolean)
   */
  public static final native boolean org_chromium_chromiumjnigenerator_ChromiumJniTestB_nativeFunctionBA(
      boolean param1, float param2);
}

Generate JNI functions through jni_generator.py

./jni_generator.py --input_file ../java/org/chromium/chromiumjnigenerator/ChromiumJniTestA.java --output_file ../cpp/gen/ChromiumJniTestA.h --input_file ../java/org/chromium/chromiumjnigenerator/ChromiumJniTestB.java --output_file ../cpp/gen/ChromiumJniTestB.h
`ChromiumJniTestA.h`

static jboolean JNI_ChromiumJniTestA_FunctionAA(JNIEnv* env, jboolean param1,
    jfloat param2);

JNI_GENERATOR_EXPORT jboolean
    Java_org_chromium_chromiumjnigenerator_ChromiumJniTestA_nativeFunctionAA(
    JNIEnv* env,
    jclass jcaller,
    jboolean param1,
    jfloat param2) {
  return JNI_ChromiumJniTestA_FunctionAA(env, param1, param2);
}

static jlong JNI_ChromiumJniTestA_FunctionAC(JNIEnv* env, const
    chromium::android::JavaParamRef
   & jcaller,
    
   const chromium::android::JavaParamRef
   
    & param1);

JNI_GENERATOR_EXPORT jlong 
    Java_org_chromium_chromiumjnigenerator_ChromiumJniTestA_nativeFunctionAC(
    JNIEnv* env,
    jobject jcaller,
    jstring param1) {
  
    return 
    JNI_ChromiumJniTestA_FunctionAC(env, chromium::android::JavaParamRef
    
     (env,
      jcaller), chromium::android::JavaParamRef
     
      (env, param1));
}
     
    
   
  
`ChromiumJniTestB.h`

static jboolean JNI_ChromiumJniTestB_NativeFunctionBA(JNIEnv* env, jboolean param1,
    jfloat param2);

JNI_GENERATOR_EXPORT jboolean
    Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1chromiumjnigenerator_1ChromiumJniTestB_1nativeFunctionBA(
    JNIEnv* env,
    jclass jcaller,
    jboolean param1,
    jfloat param2) {
  return JNI_ChromiumJniTestB_NativeFunctionBA(env, param1, param2);
}

static jfloat JNI_ChromiumJniTestB_FunctionBB(JNIEnv* env, const
    chromium::android::JavaParamRef
   & param1);

JNI_GENERATOR_EXPORT jfloat
    
   Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1chromiumjnigenerator_1ChromiumJniTestB_1functionBB(
    JNIEnv* env,
    jclass jcaller,
    jstring param1) {
  
   return 
   JNI_ChromiumJniTestB_FunctionBB(env, chromium::android::JavaParamRef
   
    (env,
      param1));
}
   
  

Create ChromiumJniTestA.cc and ChromiumJniTestB.cc to implement ChromiumJniTestA.h and ChromiumJniTestB.h

`ChromiumJniTestA.cc`

#include <ChromiumJniTestA.h>

jboolean JNI_ChromiumJniTestA_FunctionAA(JNIEnv *env, jboolean param1,
                                         jfloat param2) {
    return true;
}


jlong JNI_ChromiumJniTestA_FunctionAC(JNIEnv *env, const
chromium::android::JavaParamRef
    &jcaller,
                                      
   const chromium::android::JavaParamRef
   
     &param1) {
    
    return 
    1000.
    f;
}
   
  
`ChromiumJniTestB.cc`

#include <ChromiumJniTestB.h>

jboolean JNI_ChromiumJniTestB_NativeFunctionBA(JNIEnv* env, jboolean param1,
                                                      jfloat param2){
    return true;
}

jfloat JNI_ChromiumJniTestB_FunctionBB(JNIEnv* env, const
chromium::android::JavaParamRef
   & param1){
    
   return 
   3888.
   2f;
}
  

Remember to add the chromium-jni-generator-native-essential directory to the compilation process.

add_library(chromium_jni_generator_test_jni SHARED
        jni_main.cc
        ChromiumJniTestA.cc
        ChromiumJniTestB.cc)
target_include_directories(chromium_jni_generator_test_jni
        PRIVATE ./
        PRIVATE ./gen)

add_subdirectory(../chromium-jni-generator-native-essential chromium_jni_generator_native_essential)

target_link_libraries(chromium_jni_generator_test_jni
        PRIVATE chromium_jni_generator_native_essential)

3 C/C ++ Layer Access to Java Layer

Add @CalledByNative annotations to Java methods

`ChromiumJniTestA.java`

@JNINamespace("test::your::name::space")
public class ChromiumJniTestA {
    ...
    ...

    @CalledByNative
    public static float functionAE(String param1, boolean param2){
        return 9.7f;
    }
}

Generate C/C ++ code through jni_generator.py

g_org_chromium_chromiumjnigenerator_ChromiumJniTestA_clazz(nullptr); #ifndef org_chromium_chromiumjnigenerator_ChromiumJniTestA_clazz_defined #define org_chromium_chromiumjnigenerator_ChromiumJniTestA_clazz_defined inline jclass org_chromium_chromiumjnigenerator_ChromiumJniTestA_clazz(JNIEnv* env) { return chromium::android::LazyGetClass(env, kClassPath_org_chromium_chromiumjnigenerator_ChromiumJniTestA, &g_org_chromium_chromiumjnigenerator_ChromiumJniTestA_clazz); } #endif static std::atomic g_org_chromium_chromiumjnigenerator_ChromiumJniTestA_functionAE(nullptr); static jfloat Java_ChromiumJniTestA_functionAE(JNIEnv* env, const chromium::android::JavaRef & param1, jboolean param2) { jclass clazz = org_chromium_chromiumjnigenerator_ChromiumJniTestA_clazz(env); CHECK_CLAZZ(env, clazz, org_chromium_chromiumjnigenerator_ChromiumJniTestA_clazz(env), 0); chromium::android::JniJavaCallContextChecked call_context; call_context.Init< chromium::android::MethodID::TYPE_STATIC>( env, clazz, "functionAE", "(Ljava/lang/String;Z)F", &g_org_chromium_chromiumjnigenerator_ChromiumJniTestA_functionAE); jfloat ret = env->CallStaticFloatMethod(clazz, call_context.base.method_id, param1.obj(), param2); return ret; }">
`ChromiumJniTestA.h`

JNI_REGISTRATION_EXPORT extern const char
    kClassPath_org_chromium_chromiumjnigenerator_ChromiumJniTestA[];
const char kClassPath_org_chromium_chromiumjnigenerator_ChromiumJniTestA[] =
    "org/chromium/chromiumjnigenerator/ChromiumJniTestA";
// Leaking this jclass as we cannot use LazyInstance from some threads.
JNI_REGISTRATION_EXPORT std::atomic
    
     g_org_chromium_chromiumjnigenerator_ChromiumJniTestA_clazz(
     nullptr);
#
     ifndef org_chromium_chromiumjnigenerator_ChromiumJniTestA_clazz_defined
#
     define 
     org_chromium_chromiumjnigenerator_ChromiumJniTestA_clazz_defined

     inline jclass 
     org_chromium_chromiumjnigenerator_ChromiumJniTestA_clazz(JNIEnv* env) {
  
     return 
     chromium::android::LazyGetClass(env,
      
     kClassPath_org_chromium_chromiumjnigenerator_ChromiumJniTestA,
      &g_org_chromium_chromiumjnigenerator_ChromiumJniTestA_clazz);
}
#
     endif


     static std::atomic
     
    
      g_org_chromium_chromiumjnigenerator_ChromiumJniTestA_functionAE(
      nullptr);

      static jfloat 
      Java_ChromiumJniTestA_functionAE(JNIEnv* env, 
      const
    chromium::android::JavaRef
      
       & param1,
    jboolean param2) {
  jclass clazz = 
       org_chromium_chromiumjnigenerator_ChromiumJniTestA_clazz(env);
  
       CHECK_CLAZZ(env, clazz,
      
       org_chromium_chromiumjnigenerator_ChromiumJniTestA_clazz(env), 
       0);

  chromium::android::JniJavaCallContextChecked call_context;
  call_context.
       Init<
      chromium::android::MethodID::TYPE_STATIC>(
          env,
          clazz,
          
       "functionAE",
          
       "(Ljava/lang/String;Z)F",
          &g_org_chromium_chromiumjnigenerator_ChromiumJniTestA_functionAE);

  jfloat ret =
      env->
       CallStaticFloatMethod(clazz,
          call_context.
       base.
       method_id, param1.
       obj(), param2);
  
       return ret;
}
      
     
    
You might also like...
VG-Scraper is a python program using the module called BeautifulSoup which allows anyone to scrape something off an website. This program lets you put in a number trough an input and a number is 1 news article.

VG-Scraper VG-Scraper is a convinient program where you can find all the news articles instead of finding one yourself. Installing [Linux] Open a term

An experiment to deploy a serverless infrastructure for a scrapy project.
An experiment to deploy a serverless infrastructure for a scrapy project.

Serverless Scrapy project This project aims to evaluate the feasibility of an architecture based on serverless technology for a web crawler using scra

Python Web Scrapper Project

Web Scrapper Projeto desenvolvido em python, sobre tudo com Selenium, BeautifulSoup e Pandas é um web scrapper que puxa uma tabela com as principais e

A web scraping pipeline project that retrieves TV and movie data from two sources, then transforms and stores data in a MySQL database.
A web scraping pipeline project that retrieves TV and movie data from two sources, then transforms and stores data in a MySQL database.

New to Streaming Scraper An in-progress web scraping project built with Python, R, and SQL. The scraped data are movie and TV show information. The go

This is a sport analytics project that combines the knowledge of OOP and Webscraping
This is a sport analytics project that combines the knowledge of OOP and Webscraping

This is a sport analytics project that combines the knowledge of Object Oriented Programming (OOP) and Webscraping, the weekly scraping of the English Premier league table is carried out to assess the performance of each club from the beginning of the season to the end.

Rottentomatoes, Goodreads and IMDB sites crawler. Semantic Web final project.

Crawler Rottentomatoes, Goodreads and IMDB sites crawler. Crawler written by beautifulsoup, selenium and lxml to gather books and films information an

This project was created using Python technology and flask tools to scrape a music site

python-scrapping This project was created using Python technology and flask tools to scrape a music site You need to install the following packages to

Instagram_scrapper - This project allow you to scrape the list of followers, following or both from a public Instagram account, and create a csv or excel file easily.

Instagram_scrapper This project allow you to scrape the list of followers, following or both from a public Instagram account, and create a csv or exce

Bigdata - This Scrapy project uses Redis and Kafka to create a distributed on demand scraping cluster

Scrapy Cluster This Scrapy project uses Redis and Kafka to create a distributed

Releases(v1.0.0)
Owner
allenxuan
allenxuan
Quick Project made to help scrape Lexile and Atos(AR) levels from ISBN

Lexile-Atos-Scraper Quick Project made to help scrape Lexile and Atos(AR) levels from ISBN You will need to install the chrome webdriver if you have n

1 Feb 11, 2022
A training task for web scraping using python multithreading and a real-time-updated list of available proxy servers.

Parallel web scraping The project is a training task for web scraping using python multithreading and a real-time-updated list of available proxy serv

Kushal Shingote 1 Feb 10, 2022
👁️ Tool for Data Extraction and Web Requests.

httpmapper 👁️ Project • Technologies • Installation • How it works • License Project 🚧 For educational purposes. This is a project that I developed,

15 Dec 05, 2021
优化版本的京东茅台抢购神器

优化版本的京东茅台抢购神器

1.8k Mar 18, 2022
Get-web-images - A python code that get images from any site

image retrieval This is a python code to retrieve an image from the internet, a

CODE 1 Dec 30, 2021
京东茅台抢购最新优化版本,京东秒杀,添加误差时间调整,优化了茅台抢购进程队列

京东茅台抢购最新优化版本,京东秒杀,添加误差时间调整,优化了茅台抢购进程队列

776 Jul 28, 2021
Luis M. Capdevielle 1 Jan 14, 2022
New World Market Scraper

Bean Seller A New Worlds market scraper. Deployment This must be installed on Windows as it uses the Windows api to do its stuff Install Prerequisites

4 Sep 21, 2022
HappyScrapper - Google news web scrapper with python

HappyScrapper ~ Google news web scrapper INSTALLATION ♦ Clone the repository ♦ O

Jhon Aguiar 0 Nov 07, 2022
An experiment to deploy a serverless infrastructure for a scrapy project.

Serverless Scrapy project This project aims to evaluate the feasibility of an architecture based on serverless technology for a web crawler using scra

José Ferraz Neto 5 Jul 08, 2022
Pythonic Crawling / Scraping Framework based on Non Blocking I/O operations.

Pythonic Crawling / Scraping Framework Built on Eventlet Features High Speed WebCrawler built on Eventlet. Supports relational databases engines like

Juan Manuel Garcia 173 Dec 05, 2022
A Python Oriented tool to Scrap WhatsApp Group Link using Google Dork it Scraps Whatsapp Group Links From Google Results And Gives Working Links.

WaGpScraper A Python Oriented tool to Scrap WhatsApp Group Link using Google Dork it Scraps Whatsapp Group Links From Google Results And Gives Working

Muhammed Rizad 27 Dec 18, 2022
A Happy and lightweight Python Package that searches Google News RSS Feed and returns a usable JSON response and scrap complete article - No need to write scrappers for articles fetching anymore

GNews 🚩 A Happy and lightweight Python Package that searches Google News RSS Feed and returns a usable JSON response 🚩 As well as you can fetch full

Muhammad Abdullah 273 Dec 31, 2022
用python爬取江苏几大高校的就业网站,并提供3种方式通知给用户,分别是通过微信发送、命令行直接输出、windows气泡通知。

crawler_for_university 用python爬取江苏几大高校的就业网站,并提供3种方式通知给用户,分别是通过微信发送、命令行直接输出、windows气泡通知。 环境依赖 wxpy,requests,bs4等库 功能描述 该项目基于python,通过爬虫爬各高校的就业信息网,爬取招聘信

8 Aug 16, 2021
Find thumbnails and original images from URL or HTML file.

Haul Find thumbnails and original images from URL or HTML file. Demo Hauler on Heroku Installation on Ubuntu $ sudo apt-get install build-essential py

Vinta Chen 150 Oct 15, 2022
fork huanghyw/jd_seckill

Jd_Seckill 特别声明: 本仓库发布的jd_seckill项目中涉及的任何脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。 本项目内所有资源文件,禁止任何公众号、自媒体进行任何形式的转载、发布。

512 Jan 03, 2023
🕷 Phone Crawler with multi-thread functionality

Phone Crawler: Phone Crawler with multi-thread functionality Disclaimer: I'm not responsible for any illegal/misuse actions, this program was made for

Kmuv1t 3 Feb 10, 2022
Scrapes Every Email Address of Every Society in Every University

society-email-scrape Site Live at https://kcsoc.github.io/society-email-scrape/ How to automatically generate new data Go to unis.yml Add your uni Cre

Krishna Consciousness Society 18 Dec 14, 2022
腾讯课堂,模拟登陆,获取课程信息,视频下载,视频解密。

腾讯课堂脚本 要学一些东西,但腾讯课堂不支持自定义变速,播放时有水印,且有些老师的课一遍不够看,于是这个脚本诞生了。 时间比较紧张,只会不定时修复重大bug。多线程下载之类的功能更新短期内不会有,如果你想一起完善这个脚本,欢迎pr 2020.5.22测试可用 使用方法 很简单,三部完成 下载代码,

163 Dec 30, 2022
Scrapy, a fast high-level web crawling & scraping framework for Python.

Scrapy Overview Scrapy is a fast high-level web crawling and web scraping framework, used to crawl websites and extract structured data from their pag

Scrapy project 45.5k Jan 07, 2023