【问题标题】:Native interface for auto run on Boot in cn1cn1开机自动运行的原生接口
【发布时间】:2017-09-09 13:21:27
【问题描述】:

我不太清楚如何通过native interface在cn1中实现native android代码,虽然我已经做了一些成功的事情。下面是原生 android 代码和我在 cn1 原生界面中所做的尝试。我有几个问题:

1) 如何调用 nativeImpl 类中的类?例如:我在项目的 native/android 文件夹中创建了 YourActivityRunOnStartup 类。如何在 nativeImpl 类中调用它?清单中的接收者有此类未找到异常。

2)在我有 MainActivity.class 的 BroadcastReceiver 的 onReceive 方法中有意图,因此每次设备启动时,它都会在原生 android 中运行 MainActivity 类。如何通过native接口调用其中的cn1的特定形式或类?

原生安卓代码:

**MainActivity**
public class MainActivity extends AppCompatActivity{

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

        Log.e("bootDeviceValue", " aaaaa");
    }
}

**YourActivityRunOnStartup class**
public class YourActivityRunOnStartup extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            Log.e("bootDeviceValue", " bbbbb");
            Intent i = new Intent(context, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }
}

我在cn1中尝试过的:

尝试 1: Native/android 文件夹中的 YourActivityRunOnStartup 类

public class YourActivityRunOnStartup extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            Log.e("bootDeviceValue", " bbbbb");
            Intent i = new Intent(context, null);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }
}

构建提示:

1)android.xapplication: <receiver   android:enabled="true"   android:exported="true"   android:name=".YourActivityRunOnStartup"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter>  </receiver>

2)android.xpermissions:  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

如何在 NativeImpl 类中调用 YourActivityRunOnStartup 类以及在 cn1 代码中做什么?

NativeImpl 类

public class NativeImpl {
    public boolean isSupported() {
        return true;
    }

    //what to do here? . . . . . . . . . . . . . . . . . . 
}

诺基亚类

public void start() {
    if (current != null) {
        current.show();
        return;
    }
    na = (Native) NativeLookup.create(Native.class);
    if (na != null && na.isSupported()) {
        **// what to do here??? . . . . . . . . . . . . . . . . . .** 
    }
    new Home(theme).show();
}

调试错误:

09-04 14:28:00.805 26852-26852/com.zzzz.nokiaApp E/AndroidRuntime: FATAL EXCEPTION: main
 Process: com.zzzz.nokiaApp, PID: 26852
 java.lang.RuntimeException: Unable to instantiate receiver com.zzzz.nokiaApp.YourActivityRunOnStartup: java.lang.ClassNotFoundException: Didn't find class "com.zzzz.nokiaApp.YourActivityRunOnStartup" on path: DexPathList[[zip file "/data/app/com.zzzz.nokiaApp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.zzzz.nokiaApp-1/lib/arm, /vendor/lib, /system/lib]]
     at android.app.ActivityThread.handleReceiver(ActivityThread.java:3682)
     at android.app.ActivityThread.access$2000(ActivityThread.java:230)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1904)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:148)
     at android.app.ActivityThread.main(ActivityThread.java:7409)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
  Caused by: java.lang.ClassNotFoundException: Didn't find class "com.zzzz.nokiaApp.YourActivityRunOnStartup" on path: DexPathList[[zip file "/data/app/com.zzzz.nokiaApp-1/base.apk"],nativeLibraryDirectories=[/data/app/com.zzzz.nokiaApp-1/lib/arm, /vendor/lib, /system/lib]]
     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
     at android.app.ActivityThread.handleReceiver(ActivityThread.java:3677)
     at android.app.ActivityThread.access$2000(ActivityThread.java:230) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1904) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:7409) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
    Suppressed: java.lang.ClassNotFoundException: com.zzzz.nokiaApp.YourActivityRunOnStartup
     at java.lang.Class.classForName(Native Method)
     at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
     at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
            ... 10 more
  Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

新错误日志:

09-07 11:54:05.462 8116-8116/com.thecapitaleyenepal.nokiaApp D/AndroidRuntime: Shutting down VM
09-07 11:54:05.462 8116-8116/com.thecapitaleyenepal.nokiaApp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.thecapitaleyenepal.nokiaApp, PID: 8116
java.lang.RuntimeException: Unable to start receiver com.thecapitaleyenepal.nokiaApp.YourActivityRunOnStartup: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.thecapitaleyenepal.nokiaApp/com.thecapitaleyenepal.nokiaApp.Nokia}; have you declared this activity in your AndroidManifest.xml?
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3708)
at android.app.ActivityThread.access$2000(ActivityThread.java:230)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1904)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7409)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.thecapitaleyenepal.nokiaApp/com.thecapitaleyenepal.nokiaApp.Nokia}; have you declared this activity in your AndroidManifest.xml?
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1855)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1546)
at android.app.ContextImpl.startActivity(ContextImpl.java:752)
at android.app.ContextImpl.startActivity(ContextImpl.java:734)
at android.content.ContextWrapper.startActivity(ContextWrapper.java:345)
at android.content.ContextWrapper.startActivity(ContextWrapper.java:345)
at com.thecapitaleyenepal.nokiaApp.YourActivityRunOnStartup.onReceive(YourActivityRunOnStartup.java:25)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3701)
at android.app.ActivityThread.access$2000(ActivityThread.java:230) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1904) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:7409) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
09-07 11:54:45.302 8116-8116/com.thecapitaleyenepal.nokiaApp I/Process: Sending signal. PID: 8116 SIG: 9

AndroidManifest:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver
        android:enabled="true"
        android:exported="true"
        android:name=".YourActivityRunOnStartup">

        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>

    </receiver>
</application>

【问题讨论】:

    标签: codenameone


    【解决方案1】:

    请注意,在构建提示中包含需要更新的字符串,例如 YourActivityRunOnStartup 等。确保它们指向正确的包/类名称。

    【讨论】:

    • 我没听懂你。我在这个项目中的包名是“com.zzzz.nokiaApp”。我在 native > android 文件夹中有 YourActivityRunOnStartup 类。我需要通过 android.xapplication 在构建提示中调用这个类。 1)如何指向正确的包和类?我遇到的错误是“无法实例化接收器 com.zzzz.nokiaApp.YourActivityRunOnStartup:java.lang.ClassNotFoundException。” 2)我的第二个问题是我需要通过本机接口类(NativeImpl.class)调用cn1的表单或类。我该怎么做?
    • YourActivityRunOnStartupcom.zzzz.nokiaApp 中吗?
    • 是的,YourActivityRunOnStartup 在 com.zzzz.nokiaApp 中。看上面的截图。 (PS。我已经在包名中手动用 zzzz 替换了 thecapitaleyenepal)。可能你会感到困惑,因为我还有其他类似包名的问题,但它们是两个不同的项目,包名不同。您对包名称如此困惑的原因是什么?这个问题有什么问题吗?
    • 您在YourActivityRunOnStartup 中缺少package 语句,这就是我问的原因。它在那里并且定义正确吗?如果不是,则将其放入正确的目录层次结构并不重要
    • 哦,我忘了在课堂上添加包名。对不起。有“意图 i = new Intent(context, MainActivity.class);”在启动时运行 MainActivity 类的 broadCastListener 的 onReceive 中。我在cn1中有诺基亚类作为主类,带有init(),start()等。现在这里“Intent i = new Intent(context,Nokia.class);”,这给出了错误。请在问题末尾查看新的错误日志。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多