码迷,mamicode.com
首页 > 移动开发 > 详细

JNI交叉编译第一篇之输出helloWorld(android studio版)

时间:2016-05-12 14:04:18      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:

一.关于于NDK

1.JNI简介

  1.jni是Java native interface的缩写,java 本地接口。它提供了若干的API实现了Java和其他语言的通信(主要是C/C++)。从Java1.1开始,jni标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
  2.ndk:Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。
  3..so:共享函数库,在可执行程序启动的时候加载,所有程序重新运行时都可自动加载共享函数库中的函数。

 4.为何要使用ndk?

     1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
     2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。
     3. 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。

android studio下配置NDK环境

1.首先下载ndk包
2.进入菜单右上角file->Project Structure:进入下面界面,在最下面Android ndk location选择本地ndk的目录点击OK

技术分享
3.新建项目后,选择file->new ->Floder->jni Folder:
这时java目录下会出现一个jni文件夹
4.配置本地项目的Build.gradle,选中Module下的Build.gradle,添加如下内容

apply plugin: ‘com.android.application‘

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.lancao.myhellojni"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        //在此处添加配置
        ndk{
            moduleName "lancao"
            ldLibs "log","z","m"
            abiFilters "armeabi","armeabi-v7a","x86"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
        }
    }
}

dependencies {
    compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])
    testCompile ‘junit:junit:4.12‘
    compile ‘com.android.support:appcompat-v7:23.3.0‘
}

技术分享

5.静态加载动态库,编写naive方法,和普通java方法基本没区别。

package com.example.lancao.myhellojni;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = (TextView) findViewById(R.id.text);
        textView.setText(getStringFromNative());

    }
    //静态加载动态库
    static {
        System.loadLibrary("lancao");
    }

//申明本地方法
    public   native String getStringFromNative();

}

6.生成头文件。在android studio 的命令行界面中,进入/app/src/main/java目录下,执行命令:

javah -d  ../jni com.example.lancao.myhellojni.MainActivity

这样就在src/main/目录中新增了jni目录,以及com_example_lancao_myhellojni_MainActivity.h头文件。
技术分享
7.com_example_lancao_myhellojni_MainActivity.h的具体内容为

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_lancao_myhellojni_MainActivity */

#ifndef _Included_com_example_lancao_myhellojni_MainActivity
#define _Included_com_example_lancao_myhellojni_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif

8.新建c本地文件

//导入本地的库文件,必须添加
#include <android/log.h>
#include <jni.h>

JNIEXPORT jstring JNICALL Java_com_example_lancao_myhellojni_MainActivity_getStringFromNative(JNIEnv * env , jobject j)
{
//返回一个字符串“hello from jni !”
    return (*env)->NewStringUTF(env,"Hello From JNI!");
}

9.这样就完成了交叉编译之输出helloWorld了

JNI交叉编译第一篇之输出helloWorld(android studio版)

标签:

原文地址:http://blog.csdn.net/myloveyaqiong/article/details/51362618

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!