Skip to content

Commit

Permalink
1. fix deprecated kotlin code
Browse files Browse the repository at this point in the history
2. update demo code
  • Loading branch information
LanderlYoung committed Aug 29, 2024
1 parent 17beebe commit fcd97d5
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 56 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -400,7 +400,7 @@ class NativeProxyGenerator(env: Environment, clazz: TypeElement, nativeProxy: Na
private fun StringBuilder.buildFieldDefines(useJniHelper: Boolean) {
mFields.forEachIndexed { index, f ->
val isStatic = f.modifiers.contains(Modifier.STATIC)
val camelCaseName = f.simpleName.toString().capitalize(Locale.ROOT)
val camelCaseName = f.simpleName.toString().capitalize()
val getterSetters = hasGetterSetter(f)
val fieldId = getFieldName(f, index)
val typeForJniCall = getTypeForJniCall(f.asType())
Expand Down Expand Up @@ -850,10 +850,14 @@ class NativeProxyGenerator(env: Environment, clazz: TypeElement, nativeProxy: Na
val result: String
val k = type.kind
result = if (k.isPrimitive || k == TypeKind.VOID) {
k.name.toLowerCase(Locale.US)
k.name.lowercase(Locale.US)
} else {
"object"
}
return result.capitalize()
}
}

// replace deprecated kotlin-stdlib one
private fun String.capitalize():String =
replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.US) else it.toString() }
78 changes: 51 additions & 27 deletions sample-android/src/main/cpp/ComputeIntensiveClass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#include "gen/jenny_fusion_proxies.h"

/*
* Class: io_github_landerlyoung_jennysampleapp_ComputeIntensiveClass
* Class: io.github.landerlyoung.jennysampleapp.ComputeIntensiveClass
* Method: public int addInNative(int a, int b)
* Signature: (II)I
*/
Expand All @@ -21,7 +21,7 @@ jint ComputeIntensiveClass::addInNative(JNIEnv* env, jobject thiz, jint a, jint
}

/*
* Class: io_github_landerlyoung_jennysampleapp_ComputeIntensiveClass
* Class: io.github.landerlyoung.jennysampleapp.ComputeIntensiveClass
* Method: public static void computeSomething(byte[] sth)
* Signature: ([B)V
*/
Expand All @@ -30,7 +30,7 @@ void ComputeIntensiveClass::computeSomething(JNIEnv *env, jclass clazz, jbyteArr
}

/*
* Class: io_github_landerlyoung_jennysampleapp_ComputeIntensiveClass
* Class: io.github.landerlyoung.jennysampleapp.ComputeIntensiveClass
* Method: public static java.lang.String greet()
* Signature: ()Ljava/lang/String;
*/
Expand All @@ -39,7 +39,7 @@ jstring ComputeIntensiveClass::greet(JNIEnv *env, jclass clazz) {
}

/*
* Class: io_github_landerlyoung_jennysampleapp_ComputeIntensiveClass
* Class: io.github.landerlyoung.jennysampleapp.ComputeIntensiveClass
* Method: public final void testParamParse(int a, java.lang.String b, long[] c, float[][] d, java.lang.Exception e, java.lang.Class<java.lang.String> f, java.util.HashMap<?,?> g)
* Signature: (ILjava/lang/String;[J[[FLjava/lang/Exception;Ljava/lang/Class;Ljava/util/HashMap;)V
*/
Expand All @@ -48,7 +48,7 @@ void ComputeIntensiveClass::testParamParse(JNIEnv *env, jobject thiz, jint a, js
}

/*
* Class: io_github_landerlyoung_jennysampleapp_ComputeIntensiveClass
* Class: io.github.landerlyoung.jennysampleapp.ComputeIntensiveClass
* Method: public static long returnsLong()
* Signature: ()J
*/
Expand All @@ -57,7 +57,7 @@ jlong ComputeIntensiveClass::returnsLong(JNIEnv *env, jclass clazz) {
}

/*
* Class: io_github_landerlyoung_jennysampleapp_ComputeIntensiveClass
* Class: io.github.landerlyoung.jennysampleapp.ComputeIntensiveClass
* Method: public static boolean returnsBool()
* Signature: ()Z
*/
Expand All @@ -66,7 +66,7 @@ jboolean ComputeIntensiveClass::returnsBool(JNIEnv *env, jclass clazz) {
}

/*
* Class: io_github_landerlyoung_jennysampleapp_ComputeIntensiveClass
* Class: io.github.landerlyoung.jennysampleapp.ComputeIntensiveClass
* Method: public static java.lang.Object returnsObject()
* Signature: ()Ljava/lang/Object;
*/
Expand All @@ -93,7 +93,7 @@ void ComputeIntensiveClass::testOverload__I(JNIEnv *env, jclass clazz, jint i) {
}

/*
* Class: io_github_landerlyoung_jennysampleapp_ComputeIntensiveClass
* Class: io.github.landerlyoung.jennysampleapp.ComputeIntensiveClass
* Method: public static java.lang.String httpGet(java.lang.String url)
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
Expand Down Expand Up @@ -139,38 +139,62 @@ void ComputeIntensiveClass::runJniHelperTest(JNIEnv* env, jclass clazz) {
}

/*
* Class: io_github_landerlyoung_jennysampleapp_ComputeIntensiveClass
* Class: io.github.landerlyoung.jennysampleapp.ComputeIntensiveClass
* Method: public int computeThenCallback(io.github.landerlyoung.jennysampleapp.Callback listener)
* Signature: (Lio/github/landerlyoung/jennysampleapp/Callback;)I
*/
jint ComputeIntensiveClass::computeThenCallback(JNIEnv* env, jobject thiz, jobject listener) {
CallbackProxy::onJobStart(env, listener);
static int count = 0;
bool useJniHelper = count++ % 2 == 0;

if (useJniHelper) {
CallbackProxy proxy{listener, false};
auto name = proxy.getName();

auto newInstance = CallbackProxy::newInstance();
proxy.setLock(newInstance.getThis(false));
proxy.onJobProgress(20);

auto nestedClass = NestedClassProxy::newInstance(proxy.getThis(false));
proxy.setLock(nestedClass.getThis(false));
proxy.onJobProgress(50);

auto name = CallbackProxy::getName(env, listener);
CallbackProxy::setAStaticField(nullptr);

proxy.setCount(100);
proxy.setLock(proxy.getThis(false));
proxy.onJobProgress(100);

auto newInstance = CallbackProxy::newInstance(env);
CallbackProxy::setLock(env, listener, newInstance);
CallbackProxy::onJobProgress(env, listener, 20);
auto str = jenny::toJavaString("Yes, callback from jni w/ jnihelper");
proxy.onJobDone(JNI_TRUE, str);
} else {
CallbackProxy::onJobStart(env, listener);

auto nestedClass = NestedClassProxy::newInstance(env, listener);
CallbackProxy::setLock(env, newInstance, nestedClass);
CallbackProxy::onJobProgress(env, listener, 50);
auto name = CallbackProxy::getName(env, listener);

CallbackProxy::setAStaticField(env, nullptr);
auto newInstance = CallbackProxy::newInstance(env);
CallbackProxy::setLock(env, listener, newInstance);
CallbackProxy::onJobProgress(env, listener, 20);

CallbackProxy::setCount(env, listener, 100);
CallbackProxy::setLock(env, listener, listener);
CallbackProxy::onJobProgress(env, listener, 100);
auto nestedClass = NestedClassProxy::newInstance(env, listener);
CallbackProxy::setLock(env, newInstance, nestedClass);
CallbackProxy::onJobProgress(env, listener, 50);

jstring str = env->NewStringUTF("Yes, callback from jni");
CallbackProxy::onJobDone(env, listener, JNI_TRUE, str);
CallbackProxy::setAStaticField(env, nullptr);

env->DeleteLocalRef(name);
env->DeleteLocalRef(str);
CallbackProxy::setCount(env, listener, 100);
CallbackProxy::setLock(env, listener, listener);
CallbackProxy::onJobProgress(env, listener, 100);

env->DeleteLocalRef(newInstance);
env->DeleteLocalRef(nestedClass);
jstring str = env->NewStringUTF("Yes, callback from jni w/o jnihelper");
CallbackProxy::onJobDone(env, listener, JNI_TRUE, str);

env->DeleteLocalRef(name);
env->DeleteLocalRef(str);

env->DeleteLocalRef(newInstance);
env->DeleteLocalRef(nestedClass);
}
return 0;
}

Expand Down
35 changes: 25 additions & 10 deletions sample-android/src/main/cpp/NativeDrawable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,26 +33,39 @@ class State {


/*
* Class: io_github_landerlyoung_jennysampleapp_NativeDrawable
* Class: io.github.landerlyoung.jennysampleapp.NativeDrawable
* Method: private final long nativeInit()
* Signature: ()J
*/
jlong NativeDrawable::nativeInit(JNIEnv *env, jobject thiz) {
using jenny::GraphicsProxy;
using android::StyleProxy;
GenericProxy::initClazz(env);

auto fillType = android::StyleProxy::getFILL(env);
auto paint = GraphicsProxy::newPaint(env);
GraphicsProxy::paintSetStyle(env, paint, fillType);
static int count = 0;
bool useJniHelper = count++ % 2 == 0;

auto paintGlobal = env->NewGlobalRef(paint);
if (useJniHelper) {
auto fillType = StyleProxy::getFILL();
auto paint = GraphicsProxy::newPaint();
GraphicsProxy::paintSetStyle(paint, fillType);

return reinterpret_cast<jlong>(new State(paintGlobal));
auto paintGlobal = paint.toGlobal();
return reinterpret_cast<jlong>(new State(paintGlobal.release()));
} else {
auto fillType = StyleProxy::getFILL(env);
auto paint = GraphicsProxy::newPaint(env);
GraphicsProxy::paintSetStyle(env, paint, fillType);

auto paintGlobal = env->NewGlobalRef(paint);

env->DeleteLocalRef(fillType);
env->DeleteLocalRef(paint);
return reinterpret_cast<jlong>(new State(paintGlobal));
}
}

/*
* Class: io_github_landerlyoung_jennysampleapp_NativeDrawable
* Class: io.github.landerlyoung.jennysampleapp.NativeDrawable
* Method: public final void onClick()
* Signature: ()V
*/
Expand All @@ -62,7 +75,7 @@ void NativeDrawable::onClick(JNIEnv *env, jobject thiz) {
}

/*
* Class: io_github_landerlyoung_jennysampleapp_NativeDrawable
* Class: io.github.landerlyoung.jennysampleapp.NativeDrawable
* Method: public void draw(android.graphics.Canvas canvas)
* Signature: (Landroid/graphics/Canvas;)V
*/
Expand All @@ -82,10 +95,12 @@ void NativeDrawable::draw(JNIEnv *env, jobject thiz, jobject _canvas) {
RectProxy::exactCenterY(env, bounds)) * 0.7f,
state->paint
);

env->DeleteLocalRef(bounds);
}

/*
* Class: io_github_landerlyoung_jennysampleapp_NativeDrawable
* Class: io.github.landerlyoung.jennysampleapp.NativeDrawable
* Method: public final void release()
* Signature: ()V
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,18 @@
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;


public class MainActivity extends AppCompatActivity {

Expand All @@ -43,8 +46,8 @@ protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);

mNativeDrawable = new NativeDrawable();
View bg = findViewById(R.id.text);
bg.setBackground(mNativeDrawable);
ImageView bg = findViewById(R.id.image);
bg.setImageDrawable(mNativeDrawable);
bg.setOnClickListener(v -> {
bg.invalidate();
mNativeDrawable.onClick();
Expand All @@ -57,6 +60,7 @@ protected void onCreate(Bundle savedInstanceState) {

final ComputeIntensiveClass nativeClass = new ComputeIntensiveClass();
mTextView = findViewById(R.id.text);
mTextView.setOnClickListener(v -> mTextView.setText(null));
mTextView.setText("1 + 2 = " + nativeClass.addInNative(1, 2) + "\n");
mTextView.append(ComputeIntensiveClass.greet());
ComputeIntensiveClass.testOverload();
Expand All @@ -67,8 +71,10 @@ protected void onCreate(Bundle savedInstanceState) {
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Hello", Snackbar.LENGTH_SHORT)
.show();
testComputeIntensiveClass(view);
}

private void testComputeIntensiveClass(View view) {
ComputeIntensiveClass.NestedNativeClass nestedNativeClass = new ComputeIntensiveClass.NestedNativeClass();
long handle = nestedNativeClass.nativeInit();
nestedNativeClass.testOverload();
Expand All @@ -79,12 +85,12 @@ public void onClick(View view) {
@Override
public void onJobDone(boolean success, String result) {
toast("success=" + success + " result=" + result
+ "\ncount=" + count + " obj==this = " + (lock == this));
+ "\ncount=" + count + " obj==this = " + (lock == this) + "\n");
}

@Override
public void onJobProgress(long progress) {
toast("onJobProgress = " + progress + " lock = " + System.identityHashCode(lock));
toast("onJobProgress = " + progress + " lock = " + lock);
}

@Override
Expand All @@ -104,8 +110,9 @@ public int prepareRun() {
}

private void testNativeHttpGet() {
final String json = ComputeIntensiveClass
.httpGet("https://jsonplaceholder.typicode.com/todos/1");
String url = "https://jsonplaceholder.typicode.com/todos/1";
runOnUiThread(() -> toast("http get: " + url + "\n"));
final String json = ComputeIntensiveClass.httpGet(url);
runOnUiThread(() -> toast("http got\n" + json));
}

Expand All @@ -121,9 +128,4 @@ private void toast(String msg) {
mTextView.append(msg);
}

public void test(Callback callback) {
int a = Callback.COMPILE_CONSTANT_INT;
int b = callback.count;
int c = a + b;
}
}
11 changes: 11 additions & 0 deletions sample-android/src/main/res/layout/content_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,22 @@
android:layout_height="match_parent"
android:text="Hello World!"
android:padding="10dp"
android:fontFamily="monospace"
app:layout_constraintBottom_toBottomOf="@+id/content_main"
app:layout_constraintLeft_toLeftOf="@+id/content_main"
app:layout_constraintRight_toRightOf="@+id/content_main"
app:layout_constraintTop_toTopOf="@+id/content_main"
android:id="@+id/text"
/>

<ImageView
android:id="@+id/image"
android:layout_width="256dp"
android:layout_height="256dp"
android:padding="16dp"
android:alpha="0.5"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>

</androidx.constraintlayout.widget.ConstraintLayout>

0 comments on commit fcd97d5

Please # to comment.