JNI入门

首先声明一点,Eclipse不仅仅适合于开发Java应用程序。Eclilpse为Java开发提供了极好的支持,它的设计初衷也是为了Java。但得益于它的设计架构,Eclipse能够为包括C语言在内的任何语言的开发提供支持。一个名为CDT的插件,使得在Eclipse里能对C/C++进行开发。 首先说明几个概念 NDK(Native Development Kit)是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。 JNI(Java Native Interface)它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。

接下来我将来展示一下一个简单的JNI开发 1.配置NDK环境 (这里使用最新ndk,以前做Android的项目要用到NDK就必须要下载NDK,安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配置编译器,环境变量,特别麻烦,新版就不需要了) 下载用于开发Android NDK的插件,ADT版本在20以上,就能安装NDK插件,另外NDK集成了CDT插件。地址:http://pan.baidu.com/s/1bKvDjK 下载后放到eclipse目录的plugins目录下,重启eclipse,点击Window->Preferences->Android->NDK,设置NDK路径

ndk自己可以去官网下,这里附上我的ndk包(http://pan.baidu.com/s/1jH5SlaY) 2.生成so文件 (一)新建一个Android工程(NDKBuild) 在工程上右键点击Android Tools->Add Native Support…, 然后给我们的.so文件取个名字,例如:NDKBuild(我用默认的)

目录结构如

其中Android.mk文件中”LOCAL_MODULE:=NDKBuild”这个变量很有用 (二)编写java文件,使用native方法

public class Print {
    static {
        System.loadLibrary("NDKBuild");
    }
    public native String printHello();
}

其中,loadLibrary中的参数就是LOCAL_MODULE的值 (三)编写jni 进入bin/classes目录下,使用javah命令生成头文件

首先,路径不要搞错,是bin/classes目录。其次”javah -jni com.example.ndkbuild.Print”最后的参数是”包名+类名” 这样,在bin/classes目录下就有com_example_ndkbuild_Print.h头文件,把它放到jni文件夹下打开 然后将头文件自动生成的方法名copy到NDKBuild.cpp中,注意加上形参

#include <jni.h>
#include <string.h>
#include "com_example_ndkbuild_Print.h"
JNIEXPORT jstring JNICALL Java_com_example_ndkbuild_Print_printHello(
        JNIEnv *env, jobject j) {
    return env->NewStringUTF("hello");
}

此时如果不确定是否有错,可以run as Android Application。如果有错,Console会报错 此时的文件目录:

3.加载so并使用 在MainActivity.java添加如下代码:

public class MainActivity extends Activity {
    static {
        System.loadLibrary("NDKBuild");
    }

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

        Print print = new Print();
        Log.i("Print", print.printHello());
    }
}

后台会打印hello的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • UNPv2第七章:互斥锁与条件变量

     pthread_mutex_lock()函数是一个阻塞型的上锁函数,若互斥锁已经上了锁,调用pthread_mutex_lock()函数对互斥锁再次上锁...

    刘晓杰
  • 15(进程间通信)

    管道是Unix系统IPC最古老的方式。管道有下列两种局限性: (1) 历史上,它们是半双工的(即数据只能在一个方向上流动)。 (2) 它们只能在具有公共...

    刘晓杰
  • 12(线程控制)

    线程属性主要有: (1)线程的分离状态属性detachstate, (2)线程栈末尾的警戒缓冲区大小guardsize, (3)线程栈的最低地址st...

    刘晓杰
  • 《Monkey Java》课程1.0之前言

    《Monkey Java》系列介绍了学习Android所必需的Java基础知识, 是进一步学习《Monkey Android》课程的基础。

    GitOPEN
  • 学Java有什么好方法?严格要求自己是通往成功的桥梁

    学Java有好的方法吗?我也曾经用很长时间思考这个问题。因为我希望能够掌握这门技术,从事自己喜欢的工作。我大学学的是工商管理专业,同时我也是一名计算机爱好者。其...

    企鹅号小编
  • java学习要点

    作为一个程序员,在找工作的过程中,都会遇到笔试,而很多笔试里面都包括java,尤其是作为一个Android开发工程师,java是必备技能之一.所以为了笔试过程中...

    仇诺伊
  • 技术开发中一些名词解释

    前言 现在还记得第一次面试的时候,被问HTML全称是什么,这才意识到记住全称并不是无理取闹,而是个人对这项技术的理解程度还没到。当你去了解一个技术的时候,名词...

    Ryan-Miao
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析

    solenovex
  • 你和阿里资深架构师之间,差的不仅仅是年龄(进阶必看)

    技术zhai
  • 你必须知道的Java开发大牛

    1、James Gosling ? 在他12岁的时候,他已能设计电子游戏机,帮忙邻居修理收割机。大学时期在天文系担任程式开发工读生,1977年获得了加拿大卡尔...

    程序员宝库

扫码关注云+社区

领取腾讯云代金券