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

    运行效果:




























  • 相关阅读:
    一致性hash算法
    运算符的重载
    HTTP协议详解
    SOA 新业务语言 新系统架构——什么是SOA
    js中几种实用的跨域方法原理详解
    Linq基于两个属性的分组
    BackBone结合ASP.NET MVC实现页面路由操作
    CSS学习总结
    单页应用 WebApp SPA 骨架 框架 路由 页面切换 转场
    2016年最值得学习的五大开源项目
  • 原文地址:https://www.cnblogs.com/bingghost/p/5754685.html
Copyright © 2011-2022 走看看