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 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文件中需要做相应修改即可。
- 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 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;
}
}
- 这样当完成上述步骤后,点击run就完成,可以通过System.out进行将返回的str进行输出,但是可以在java实现层完成UI的更新,可能更好一点。
- 以上就是前面刚接触是了解的一点东西,方作此记录。