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
Web Content Retrieval for Humans™

Lassie Lassie is a Python library for retrieving basic content from websites. Usage import lassie lassie.fetch('http://www.youtube.com/watch?v

Mike Helmick 570 Dec 19, 2022
Python scraper to check for earlier appointments in Clalit Health Services

clalit-appt-checker Python scraper to check for earlier appointments in Clalit Health Services Some background If you ever needed to schedule a doctor

Dekel 16 Sep 17, 2022
Simple python tool for the purpose of swapping latinic letters with cirilic ones and vice versa in txt, docx and pdf files in Serbian language

Alpha Swap English This is a simple python tool for the purpose of swapping latinic letters with cirylic ones and vice versa, in txt, docx and pdf fil

Aleksandar Damnjanovic 3 May 31, 2022
Examine.com supplement research scraper!

ExamineScraper Examine.com supplement research scraper! Why I want to be able to search pages for a specific term. For example, I want to be able to s

Tyler 15 Dec 06, 2022
A tool can scrape product in aliexpress: Title, Price, and URL Product.

Scrape-Product-Aliexpress A tool can scrape product in aliexpress: Title, Price, and URL Product. Usage: 1. Install Python 3.8 3.9 padahal halaman ins

Rahul Joshua Damanik 1 Dec 30, 2021
薅薅乐 - JD 测试脚本

薅薅乐 安裝 使用docker docker一键安装: docker run -d --name jd classmatelin/hhl:latest. 使用 进入容器: docker exec -it jd bash 获取JD_COOKIES: python get_jd_cookies.py,

ClassmateLin 575 Dec 28, 2022
Parse feeds in Python

feedparser - Parse Atom and RSS feeds in Python. Copyright 2010-2020 Kurt McKee Kurt McKee 1.5k Dec 30, 2022

CRI Scrape is a tool for get general info about Italian Red Cross in GAIA Platform

CRI Scrape CRI Scrape is a tool for get general info about Italian Red Cross in GAIA Platform Disclaimer This code is only for educational purpose. So

Vincenzo Cardone 0 Jul 23, 2022
哔哩哔哩爬取器:以个人为中心

Open Bilibili Crawer 哔哩哔哩是一个信息非常丰富的社交平台,我们基于此构造社交网络。在该网络中,节点包括用户(up主),以及视频、专栏等创作产物;关系包括:用户之间,包括关注关系(following/follower),回复关系(评论区),转发关系(对视频or动态转发);用户对创

Boshen Shi 3 Oct 21, 2021
热搜榜-python爬虫+正则re+beautifulsoup+xpath

仓库简介 微博热搜榜, 参数wb 百度热搜榜, 参数bd 360热点榜, 参数360 csdn热榜接口, 下方查看 其他热搜待加入 如何使用? 注册vercel fork到你的仓库, 右上角 点击这里完成部署(一键部署) 请求参数 vercel配置好的地址+api?tit=+参数(仓库简介有参数信息

Harry 3 Jul 08, 2022
Python script who crawl first shodan page and check DBLTEK vulnerability

🐛 MASS DBLTEK EXPLOIT CHECKER USING SHODAN 🕸 Python script who crawl first shodan page and check DBLTEK vulnerability

Divin 4 Jan 09, 2022
An helper library to scrape data from Instagram effortlessly, using the Influencer Hunters APIs.

Instagram Scraper An utility library to scrape data from Instagram hassle-free Go to the website » View Demo · Report Bug · Request Feature About The

2 Jul 06, 2022
Web scrapping

Project Setup Table of Contents Project Setup Table of Contents Run project locally Install Requirements Run script Run project locally Install Requir

Charles 3 Feb 04, 2022
Collection of code files to scrap different kinds of websites.

STW-Collection Scrap The Web Collection; blog posts. This repo contains Scrapy sample code to scrap the following kind of websites: Do you want to lea

Tapasweni Pathak 15 Jun 08, 2022
Amazon scraper using scrapy, a python framework for crawling websites.

#Amazon-web-scraper This is a python program, which use scrapy python framework to crawl all pages of the product and scrap products data. This progra

Akash Das 1 Dec 26, 2021
A database scraper created with mechanical soup and sqlite

WebscrapingDatabases a database scraper created with mechanical soup and sqlite author: Mariya Sha Watch on YouTube: This repository was created to su

Mariya 30 Aug 08, 2022
feapder 是一款简单、快速、轻量级的爬虫框架。以开发快速、抓取快速、使用简单、功能强大为宗旨。支持分布式爬虫、批次爬虫、多模板爬虫,以及完善的爬虫报警机制。

feapder 是一款简单、快速、轻量级的爬虫框架。起名源于 fast、easy、air、pro、spider的缩写,以开发快速、抓取快速、使用简单、功能强大为宗旨,历时4年倾心打造。支持轻量爬虫、分布式爬虫、批次爬虫、爬虫集成,以及完善的爬虫报警机制。 之

boris 1.4k Dec 29, 2022
Python script to check if there is any differences in responses of an application when the request comes from a search engine's crawler.

crawlersuseragents This Python script can be used to check if there is any differences in responses of an application when the request comes from a se

Podalirius 13 Dec 27, 2022
A modern CSS selector implementation for BeautifulSoup

Soup Sieve Overview Soup Sieve is a CSS selector library designed to be used with Beautiful Soup 4. It aims to provide selecting, matching, and filter

Isaac Muse 151 Dec 23, 2022
Telegram Group Scrapper

this programe is make your work so much easy on telegrame. do you want to send messages on everyone to your group or others group. use this script it will do your work automatically with one click. a

HackArrOw 3 Dec 03, 2022