从ndk的安装到Android的apk增量升级(1)jni的简单应用

来源:互联网 发布:淘宝客注册步骤 编辑:程序博客网 时间:2024/06/05 06:59
想要学习jni的调用先要理解他的原理,在这里我就不写了,在网上搜一下都能找到详尽的文章。

本文只是围绕网上的一篇博客进行解释和补充,主要是我自己在再次接触的时候遇到的问题,之前也做过一些但是时间一长就忘记了,因此写这个文章来作为自己的一个笔记,以后忘记了方便查看。
首先是ndk环境的安装,然后写个类似于hello word的demo

一.ndk的下载(在ndk_r7之后其内部便集成了Cygwin模拟的环境,所以不用去额外的安装Cygwin)连接:http://c93.yunpan.360.cn/my#%2F%E6%96%87%E6%A1%A3%2F(仅供自己用,360云盘上的,其他人可到网上下载r7以上的版本都可以)

二.eclipse中ndk环境的搭建:(每一个progect对应着一个ndk的builder,也就是是在ndk开发的时候是对每一个工程搭建的ndk环境,以上为个人认为)

2.1参考:http://www.cnblogs.com/yejiurui/p/3476565.html中的很详细

2.2注意的点:

2.2.1:自己定义的ndk_builder要放到Builers的最上面

2.2.2:在第三步中的specify working set of relevant of resources 选取得之前建好的jni文件夹就是在之后的Android.mk中的LOCAL_PATH的值

三.安装完ndk之后就是简单jni的应用,即调用本地的方法。(也是参考上面的连接)

3.1注意的点:在写完JniClient类,也就是调用native方法的类之后生成.h文件(头文件)的时候注意:

3.1.1:进入到自己工程所存的workspace中找到自己工程的bin\classes文件到此为止,然后打开dos窗口同时进入到此文件夹中:执行命令

javah -jni com.example.HelloWorld(包名加类名,不用加.class这样的后缀);然后会在bin\classes下面生成 一个com.example.HelloWorld.h的文件,这就是你的.c文件的头文件了。将.h文件考到eclipse中的工程中的jni的文件夹中。

3.3.2:接下来就是写自己的.c文件了,也就是真正实现功能的c代码,以便编译成为.so文件(在eclipse中写和别的编辑器中写都是可以的),写好后将其copy到jni文件夹中。

3.3.3:新建Android.mk文件,连接java和c的作用;

3.3.4:为了生成兼容不同cpu的.so文件,还要自己写一个Application.mk文件   可以参考:http://www.cnblogs.com/mengshu-lbq/archive/2013/03/29/2988657.html

四.以上的编译成.so文件都会在eclipse中自动完成,因为在配置ndk环境的时候已经配置完成了。(保存文件的时候如果没有自动生成.so文件,就将工程clean一下)

如果想要在别的工程中调用已经编译好的.so文件,那么注意:a.将.so文件考入新的工程中b.控制调用native方法的类的包名和类的名称都要完全相同

五.运行就好了

六.下面是几个文件的代码,简单的实现了一个近似于hello word的功能

主activity类:

package com.example.gongjni;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity implements OnClickListener{

    private TextView showTv;
    private Button showBtn;
    
    static{
        System.loadLibrary("gongjni");
    }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        showTv = (TextView) findViewById(R.id.show_tv);
        showBtn = (Button) findViewById(R.id.show_btn);
        
        showBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View arg0) {
        
        showTv.setText(JniClient.getGongJniStr());
    }

    

}

控制调用本地方法的类:

package com.example.gongjni;

public class JniClient {

    public static native String getGongJniStr();
}

JniClient生成的.h,头文件

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

#ifndef _Included_com_example_gongjni_JniClient
#define _Included_com_example_gongjni_JniClient
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_gongjni_JniClient
 * Method:    getGongJniStr
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_gongjni_JniClient_getGongJniStr
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

真正实现功能的.c文件

#include <string.h>  
#include <jni.h>  
#include "com_example_gongjni_JniClient.h"

JNIEXPORT jstring JNICALL Java_com_example_gongjni_JniClient_getGongJniStr
  (JNIEnv* env,jobject thiz  ){
    
    return (*env)->NewStringUTF(env, "Hello from JNI !  Compiled with ABI ");
    
  }

Android.mk文件(关于其中的各个的含义用时百度)

    LOCAL_PATH := $(call my-dir)  
    $(warning "the value of LOCAL_PATH is$(LOCAL_PATH)")  
    include $(CLEAR_VARS)  
      
    LOCAL_MODULE    := gongjni
    LOCAL_SRC_FILES := gongjni.c  
      
    include $(BUILD_SHARED_LIBRARY)

Application.mk文件

APP_ABI := armeabi armeabi-v7a x86


下面的这个链接中有写好的半成品的demo需要的时候可以下载,完善基本就可以使用
http://download.csdn.net/detail/yyh352091626/9417229
0 0
原创粉丝点击