Djinni_初试Android

Djinni——Android初步使用

  1. 对于Djinni的介绍和使用这篇文章就不在赘述了,如果还不太了解的可以参考上一篇博客:博客链接、
  2. 该篇主要是将代码导入Android Studio中,该篇文章也是参考官方的demo。
  3. 因为也是刚开始接触这个Djinni这个工具,希望这篇博客可以对你有帮助,至于文章中有很多不对不足的地方会在后面的学习中不断去修改。

demo.djinni

#此方法需要在C++层面实现,Java和OC直接调用生成的对象即可
hello_world= interface +c {
        static create_with_listener(listener : text_listener):hello_world;
        get_hello_world(key : string): string;
}


# 此方法为+o +j代表需要在OC和Java层进行实现,C++层通过此对象的完成创建
text_listener = interface +o +j {
        updata_view(key : string) :string;
}

run_djinni.sh

#! /usr/bin/env bash

base_dir=$(cd "`dirname "0"`" && pwd)
cpp_out="$base_dir/generated-src/cpp"
jni_out="$base_dir/generated-src/jni"
objc_out="$base_dir/generated-src/objc"
java_out="$base_dir/generated-src/java/com/mycompany/helloworld"
java_package="com.mycompany.helloworld"
namespace="demospace"
objc_prefix="HW"
djinni_file="demo.djinni"

deps/djinni/src/run \
	--java-out $java_out \
	--java-package $java_package \
	--ident-java-field mFooBar \
	\
	--cpp-out $cpp_out \
	--cpp-namespace $namespace \
	\
	--jni-out $jni_out \
	--ident-jni-class NativeFooBar \
	--ident-jni-file NativeFooBar \
	\
	--objc-out $objc_out \
	--objc-type-prefix $objc_prefix \
	\
	--objcpp-out $objc_out \
	\
	--idl $djinni_file

上述是上个博客的demo,其实都是一起完成的,下面打入Android Studio也是以这个demo为例。

  • 1——创建项目HelloWorld

(1)注意要将 "include C++ support ",这样会方便很多,不用手动去添加。
(2)项目位置参考官方也可以自己选择,cmakeLists.txt和build.gradle文件中需要做相应修改即可。 Djinni_初试Android_第1张图片

  • 2——SDK,直接选择默认的

Djinni_初试Android_第2张图片

  • 3——Activity

(1)选择Empty 即可Djinni_初试Android_第3张图片
Djinni_初试Android_第4张图片

  • 4——C++ Standard

(1)选择C++11,后面两个可以勾选也可以不勾选
Djinni_初试Android_第5张图片


Android Studio中文件的修改

(1)CmakeLists.txt文件,内容自己根据自己项目位置自己做相应的修改,位置是相对于项目的位置,而不是项目中用到的位置,这点需要注意。
(2)要将所有cpp文件都加进去,即包括Djinni本身的support-lib/jni,自动生成的,和自己写的源代码


cmake_minimum_required(VERSION 3.4.1)

file(GLOB helloworld_sources
        ../../../deps/djinni/support-lib/jni/*.cpp
        ../../../generated-src/jni/*.cpp
        ../../../src/cpp/*.cpp
        )

add_library(helloworld SHARED ${helloworld_sources})

# include directories for header files
include_directories(
        ../../../deps/djinni/support-lib/
        ../../../deps/djinni/support-lib/jni/
        ../../../generated-src/cpp/
        ../../../generated-src/jni/
        ../../../src/cpp/
)

target_link_libraries(helloworld)

(1)build.gradle文件,其实只是在原来的添加了sourceSets 部分,这个部分根据自己将工程位置
(2)不要忘记将自己写的源java代码包含进去。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.mycompany.helloworld"
        minSdkVersion 15
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -frtti -fexceptions"
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

   // 此处为新添加
    sourceSets {
        main {
            java {
                srcDirs = [
                        "../../../generated-src/java",
                        "../../../src/java",
                        "src/main/java"
                ]
            }
        }
    }

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

MainActivity.java文件,这里注意将刚才CMakeLists.txt生成的库添加进去。

package com.mycompany.helloworld;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import com.mycompany.helloworld.TextListenerImpl;

public class MainActivity extends AppCompatActivity {

    // Used to load the 'native-lib' library on application startup.
    // 此处加载生成的helloworld库
    static {
        System.loadLibrary("helloworld");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        // 这里进行具体的调用
        TextListenerImpl listener = new TextListenerImpl();
        HelloWorld helloWorld = HelloWorld.createWithListener(listener);
        String str = helloWorld.getHelloWorld("hahaha");


    }
    
}

下面是此demo中src/java代码

TextListenerImpl.java

package com.mycompany.helloworld;

import android.widget.EditText;
import java.util.ArrayList;
import android.widget.TextView;


public class TextListenerImpl extends TextListener{

    public String  updataView(String key){
        return "TextListenerImpl + "+key;
    }
}

  1. 这样当完成上述步骤后,点击run就完成,可以通过System.out进行将返回的str进行输出,但是可以在java实现层完成UI的更新,可能更好一点。
  2. 以上就是前面刚接触是了解的一点东西,方作此记录。

你可能感兴趣的:(Android)