前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JNI入门

JNI入门

作者头像
提莫队长
发布2019-02-21 11:02:32
6970
发布2019-02-21 11:02:32
举报
文章被收录于专栏:刘晓杰刘晓杰

首先声明一点,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方法

代码语言:javascript
复制
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中,注意加上形参

代码语言:javascript
复制
#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添加如下代码:

代码语言:javascript
复制
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的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年06月06日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档