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
Script used to download data for stocks.

This script is useful for downloading stock market data for a wide range of companies specified by their respective tickers. The script reads in the d

Carmelo Gonzales 71 Oct 04, 2022
Web Scraping Framework

Grab Framework Documentation Installation $ pip install -U grab See details about installing Grab on different platforms here http://docs.grablib.

2.3k Jan 04, 2023
Scraping web pages to get data

Scraping Data Get public data and save in database This is project use Python How to run a project 1 - Clone the repository 2 - Install beautifulsoup4

Soccer Project 2 Nov 01, 2021
Scrap-mtg-top-8 - A top 8 mtg scraper using python

Scrap-mtg-top-8 - A top 8 mtg scraper using python

1 Jan 24, 2022
Here I provide the source code for doing web scraping using the python library, it is Selenium.

Here I provide the source code for doing web scraping using the python library, it is Selenium.

M Khaidar 1 Nov 13, 2021
API which uses discord to scrape NameMC searches/droptime/dropping status of minecraft names

NameMC Scrape API This is an api to scrape NameMC using message previews generated by discord. NameMC makes it a pain to scrape their website, but som

Twilak 2 Dec 22, 2021
Audio media crawler for lbry.

Audio media crawler for lbry. Requirements Python 3.8 Poetry 1.1.7 Elasticsearch 7.14.0 Lbry-sdk 0.99.0 Development This project uses poetry as a depe

Hound.fm 4 Dec 03, 2022
此脚本为 python 脚本,实现原理为利用 selenium 定位相关元素,再配合点击事件完成浏览器的自动化.

此脚本为 python 脚本,实现原理为利用 selenium 定位相关元素,再配合点击事件完成浏览器的自动化.

N0el4kLs 5 Nov 19, 2021
Kusonime scraper using python3

Features Scrap from url Scrap from recommendation Search by query Todo [+] Search by genre Example # Get download url from kusonime import Scrap

MhankBarBar 2 Jan 28, 2022
PaperRobot: a paper crawler that can quickly download numerous papers, facilitating paper studying and management

PaperRobot PaperRobot 是一个论文抓取工具,可以快速批量下载大量论文,方便后期进行持续的论文管理与学习。 PaperRobot通过多个接口抓取论文,目前抓取成功率维持在90%以上。通过配置Config文件,可以抓取任意计算机领域相关会议的论文。 Installation Down

moxiaoxi 47 Nov 23, 2022
Simple tool to scrape and download cross country ski timings and results from live.skidor.com

LiveSkidorDownload Simple tool to scrape and download cross country ski timings

0 Jan 07, 2022
Ebay Webscraper for Getting Average Product Price

Ebay-Webscraper-for-Getting-Average-Product-Price The code in this repo is used to determine the average price of an item on Ebay given a valid search

17 Jan 05, 2023
A tool for scraping and organizing data from NewsBank API searches

nbscraper Overview This simple tool automates the process of copying, pasting, and organizing data from NewsBank API searches. Curerntly, nbscrape onl

0 Jun 17, 2021
Web-scraping - Program that scrapes a website for a collection of quotes, picks one at random and displays it

web-scraping Program that scrapes a website for a collection of quotes, picks on

Manvir Mann 1 Jan 07, 2022
TarkovScrappy - A nifty little bot that lets you know if a queried item might be required for a quest at some point in the land of Tarkov!

TarkovScrappy A nifty little bot that lets you know if a queried item might be required for a quest at some point in the land of Tarkov! Hideout items

Joshua Smeda 2 Apr 11, 2022
联通手机营业厅自动做任务、签到、领流量、领积分等。

联通手机营业厅自动完成每日任务,领流量、签到获取积分等,月底流量不发愁。 功能 沃之树领流量、浇水(12M日流量) 每日签到(1积分+翻倍4积分+第七天1G流量日包) 天天抽奖,每天三次免费机会(随机奖励) 游戏中心每日打卡(连续打卡,积分递增至最高

2k May 06, 2021
Web3 Pancakeswap Sniper bot written in python3

Pancakeswap_BSC_Sniper_Bot Web3 Pancakeswap Sniper bot written in python3, Please note the license conditions! The first Binance Smart Chain sniper bo

Treading-Tigers 295 Dec 31, 2022
SmartScraper: 简单、自动、快捷的Python网络爬虫

SmartScraper: 简单、自动、快捷的Python网络爬虫 Note: The origin developer of SmartScraper is Alireza Mika, I only change a little code of AutoScraper. SmartScraper

DaDeng 9 Apr 16, 2022
Dex-scrapper - Hobby project for scrapping dex data on VeChain

Folders /zumo_abis # abi extracted from zumo repo /zumo_pools # runtime e

3 Jan 20, 2022
A web crawler for recording posts in "sina weibo"

Web Crawler for "sina weibo" A web crawler for recording posts in "sina weibo" Introduction This script helps collect attributes of posts in "sina wei

4 Aug 20, 2022