美文网首页android开发Android知识
NDK JNI 笔记(基于Eclipse)

NDK JNI 笔记(基于Eclipse)

作者: 花前月下的细说 | 来源:发表于2016-11-18 14:10 被阅读47次

    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");

    这里写图片描述

    相关文章

      网友评论

        本文标题:NDK JNI 笔记(基于Eclipse)

        本文链接:https://www.haomeiwen.com/subject/ztzjpttx.html