Djinni_初试Android
16lz
2021-01-25
Djinni——Android初步使用
- 对于Djinni的介绍和使用这篇文章就不在赘述了,如果还不太了解的可以参考上一篇博客:博客链接、
- 该篇主要是将代码导入Android Studio中,该篇文章也是参考官方的demo。
- 因为也是刚开始接触这个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; }}
- 这样当完成上述步骤后,点击run就完成,可以通过System.out进行将返回的str进行输出,但是可以在java实现层完成UI的更新,可能更好一点。
- 以上就是前面刚接触是了解的一点东西,方作此记录。
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- 一款常用的 Squid 日志分析工具
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- Android(安卓)Studio NDK项目移植问题 re-run cmake with a diff
- gdb+gdbserver调试android的so文件
- ReactNative中把js编译成bundle后,js引用的图片的去向