You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在普通Java Activity中使用Android NDK并调用android_main?

可行,但需手动触发android_main调用

android_main是NDK为NativeActivity预设的原生入口函数,只有NativeActivity会在启动时通过内部JNI逻辑自动调用它。普通Java Activity没有这个默认触发机制,所以需要你手动在Java层通过JNI调用它,或者调整代码结构保留该函数的同时适配普通Activity。

具体实现思路

  1. 加载原生库并暴露JNI方法
    在你的Java Activity中加载原生库,并声明一个native方法用于触发原生逻辑:

    public class MainActivity extends Activity {
        static {
            System.loadLibrary("your-native-lib");
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            // 调用native方法触发android_main
            triggerAndroidMain();
        }
    
        private native void triggerAndroidMain();
    }
    
  2. 在C++中实现JNI方法并调用android_main
    注意:android_main需要接收android_app结构体指针,而普通Activity不会自动创建这个结构体。如果你的android_main逻辑不依赖android_app的复杂状态(比如窗口、生命周期回调),可以构造一个基础结构体传入;如果依赖这些状态,建议将核心逻辑从android_main中剥离,单独封装为可调用的函数:

    #include <android_native_app_glue.h>
    
    // 保留原有的android_main
    void android_main(struct android_app* app) {
        // 你的原生逻辑代码
    }
    
    extern "C" JNIEXPORT void JNICALL
    Java_com_example_yourpackage_MainActivity_triggerAndroidMain(JNIEnv* env, jobject thiz) {
        // 如果android_main不依赖android_app的有效状态,构造一个空结构体调用
        struct android_app dummy_app = {0};
        android_main(&dummy_app);
    
        // 更稳妥的方式:将android_main内的核心逻辑抽离
        // core_app_logic(); // 直接调用剥离后的逻辑函数
    }
    

关键注意事项

  • 如果你的C++代码大量依赖android_app中的窗口、消息队列或生命周期回调,直接调用android_main会因为结构体未正确初始化导致崩溃。这种情况建议彻底解耦android_app相关逻辑,改用JNI直接与Java Activity交互(比如通过JNI获取Context、注册生命周期回调等)。
  • 无需在Manifest中声明NativeActivity,保持普通Java Activity的配置即可。

内容的提问来源于stack exchange,提问作者Alexey S. Larionov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:41:05