zoukankan      html  css  js  c++  java
  • ndk学习17: jni之Java调用C&C++


    一.Hello World
    1. 定义函数原型

    native关键字定义的函数即为jni函数


    2.生成头文件

    切换到src目录执行: (这个过程可以写脚本自动完成,比如自动拷贝到jni目录)
    javah -jni 包名.类名

    在根目录下生成:
    org_bing_testjni_MainActivity.h


    3. 工程中添加jni代码
    工程右键->添加native code->输入名字->finish

    多了如下文


    新建一个Application.mk,配置相关选项(详细查看ndk有关Application的说明)
    APP_ABI := x86
    APP_PLATFORM := android-14
    APP_STL := stlport_static
    APP_CPPFLAGS += -fexceptions
    APP_CPPFLAGS += -frtti 

    同时把刚刚生成的.h文件拷贝到jni目录


    4. 实现native函数
    函数的声明已经在头文件生成了


    在CPP实现上述函数:
    #include "org_bing_testjni_MainActivity.h"
    #include <stdio.h>
    #include <string>
    using namespace std;
    jstring JNICALL Java_org_bing_testjni_MainActivity_sayHello
    (JNIEnvenvjobject objjstring name)
    {
        const charpname = env->GetStringUTFChars(nameNULL);
        string str_info = "Hello World:";
        str_info += pname;
        jstring ret_str = env->NewStringUTF(str_info.c_str());
        // C文件使用(*env)->Fun(env,xxx,...)的方式传递
        // (*env)->NewStringUTF(env, "Hello World");
        return ret_str;
    }
    JNIEXPORT jint JNICALL Java_org_bing_testjni_MainActivity_Add
      (JNIEnv *envjobject objjint ajint b)
    {
        return a + b;
    }

    编译在libs目录生成libTestJni.so,打包APK会自动将上述函数打包到APK

    5. 在Java中使用
    loadLibrary
    static
    {
        System.loadLibrary("TestJni");
    }  

    然后直接调用即可:
    Log.d("__BING__", sayHello("bing"));
    Log.d("__BING__""5 + 3=" + Add(5,3));  

    运行效果:




























  • 相关阅读:
    QQ视频直播架构及原理 流畅与低延迟之间做平衡 音画如何做同步?
    边缘推流与中心推流对比
    推流协议 支持RTMP协议推流
    改变原型
    window.onbeforeunload 埋点 页面停留时间
    修改/etc/hosts 云服务器 没有做外网转内网的优化
    :nohlsearch
    z waiting to receive.**B0100000023be50
    Powered by Flink
    负载均衡
  • 原文地址:https://www.cnblogs.com/bingghost/p/5754685.html
Copyright © 2011-2022 走看看