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 bashbase_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文件中需要做相应修改即可。

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

  • 3——Activity

(1)选择Empty 即可

  • 4——C++ Standard

(1)选择C++11,后面两个可以勾选也可以不勾选


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 filesinclude_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. 以上就是前面刚接触是了解的一点东西,方作此记录。

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 一款常用的 Squid 日志分析工具
  3. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  4. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  5. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  6. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  7. Android(安卓)Studio NDK项目移植问题 re-run cmake with a diff
  8. gdb+gdbserver调试android的so文件
  9. ReactNative中把js编译成bundle后,js引用的图片的去向

随机推荐

  1. Android系统零碎知识整理
  2. Kotlin中的@JvmOverloads
  3. AndroidManifest.xml简单解析
  4. android 64 32jianrong
  5. 【Tech-Android-Other】Android中的Futur
  6. DrawerLayout中加入多个View
  7. include及merge在androidmanifest.xml中
  8. Android各个版本 版本号对应关系表
  9. android 添加混淆
  10. Android(安卓)NDK 工具链的使用方法(Stand