• 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));  

    运行效果:




























  • 相关阅读:
    GC原理知多少
    C# 编译运行原理
    NetCore无需添加web/wcf引用来调用webservice
    WPF基础知识-资源概述
    WPF基础知识-XAML概述
    WPF入门-使用C#创建简单应用
    WPF概述
    Entity Framework Core
    Entity Framework Core
    Entity Framework Core
  • 原文地址:https://www.cnblogs.com/bingghost/p/5754685.html
Copyright © 2020-2023  润新知