NDK JNI 笔记(基于Eclipse)

1.首先是先安装好 android-ndk-r10e ,这是必须的第一步。

2.新建一个Android 工程,并在目录中新建一个jni目录,里面用来放置mk,.h,和.c 文件(当然,这里还没生成)
3.编写本地方法的声明,public static native String getStringFromC();
4.(这一步应该在最后,提前说明)为了方便编译so库,可以直接在eclipse中配置好NDK目录和命令,

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

上面选择安装的NDK目录,下面选择编译的Android工程
,这样配置好,就可以在运行程序的时候,不用再命令行去编译so库了。

5.生成.h 头文件
javah -classpath bin/classes;D:\Android_tools\adt-bundle-windows-x86_64-20140702\sdk\platforms\android-20\android.jar -d jni com.example.hellondk.MainActivity

记住,若出现
这里写图片描述

,则是忘记把android.jar 目录加进去了。

6.编写.mk文件,不用记住,只需到android-ndk-r10e目录中的sample中,复制,进行修改即可
如:

#
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello         生成的so库的名字。
LOCAL_SRC_FILES := hello.c  要编译的c文件。
include $(BUILD_SHARED_LIBRARY)

7.根据.h头文件,编写c文件的函数实现:

#include <stdio.h>
#include <stdlib.h>
#include "com_example_hellondk_MainActivity.h"
JNIEXPORT jstring JNICALL Java_com_example_hellondk_MainActivity_getStringFromC(
        JNIEnv * env, jclass jclass) {
    return (*env)->NewStringUTF(env, "Hello from JNI !!++!!!!");
}

8.调用本地方法:

首先,加载so库:

    static{
        System.loadLibrary("hello");
    }

然后,即可调用:

package com.example.hellondk;

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

public class MainActivity extends Activity {
    static{
        System.loadLibrary("hello");
    }
    
    TextView tView;
    public static native String getStringFromC();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tView = (TextView) findViewById(R.id.tv);
        tView.setText(getStringFromC());
    }
}



这里写图片描述

由于刚接触jni,所以,为了记忆深刻,重新把这一个完整的步骤重新实现了一遍,以加深记忆,也可方便日后查看。



为C实现的方法加入日志打印

其实,只是导入一下所需要的包和头文件,再修改一下mk文件即可

1.在.C文件中加入:

#include <android/log.h>
#define TAG "HELLOLOG"
#define LOGV(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)

2.修改.mk文件:

LOCAL_LDLIBS    += -llog

即可在.c方法中直接调用LOGV(“”);方法
LOGV("log from native");

这里写图片描述

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android游戏开发实践(1)之NDK与JNI开发02 承接上篇Android游戏开发实践(1)之NDK与JNI...
    AlphaGL阅读 9,148评论 0 24
  • 一、NDK产生的背景 Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于J...
    Ten_Minutes阅读 8,917评论 1 27
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,905评论 25 709
  • 感赏:感谢张丽娟和谢慧琳的帮助! 感赏:群里面的正能量越来越好! 感赏:领导的宽容大义 感赏:写了一篇舒缓之想和感...
    樱木兰阅读 1,202评论 0 0
  • 前言: 最近準備德語的期中小考後,開始去思考一些問題,到底在信息爆炸的現今,有多少人能以穩健、踏實、按部就搬的節奏...
    小慷阅读 1,137评论 0 1