Android jni helloworld

新建Android项目,设置布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="click"
        android:text="调用C函数" />
</RelativeLayout>

jni开发的步骤

①写java代码 声明本地方法 用到native关键字 本地方法不用去实现

②项目根目录下创建jni文件夹

③在jni文件夹下创建.c文件

④ 导入<jni.h>

#include<stdlib.h>
#include<stdio.h>
#include<jni.h>

//JNIEnv* env是JNINativeInterface的二级指针
//JNIEnv是JNINativeInterface的一级指针
//JNINativeInterface结构体中定义了大量的函数指针,这些函数指针在jni开发中很常用
//(*env)->调用结构体中的函数指针
//jobject 调用本地函数的java对象,在这个例子中就是MainActivity的实例
//C本地函数命名规则Java_包名_类名_本地方法名
//jstring (*NewStringUTF)(JNIEnv*, const char*)
jstring Java_com_wuyudong_jnihello_MainActivity_helloFromC(JNIEnv* env, jobject thiz) {

    char* str = "hello from c!";
    return (*env)->NewStringUTF(env, str);

}

⑤ 创建Android.mk makefile 告诉编译器.c的源文件在什么地方,要生成的编译对象的名字是什么

LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := hello #指定了生成的动态链接库的名字
    LOCAL_SRC_FILES := hello.c #指定了C的源文件叫什么名字
    include $(BUILD_SHARED_LIBRARY)

⑥ 调用ndk-build编译c代码生成动态链接库.so文件 文件的位置 lib->armeabi->.so

项目的路径:F:\workspace_sdk4\01_JNIHelloworld

打开cmd

输入:cd /d F:\workspace_sdk4\01_JNIHelloworld

输入:ndk-build

编译速度很快,生成的文件在libs目录下,刷新项目就可以看到

⑦ 在java代码中加载动态链接库 System.loadlibrary("动态链接库的名字"); Android.mkLOCAL_MODULE所指定的名字

MainActivity.java

package com.wuyudong.jnihello;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void click(View view) {
        System.loadLibrary("hello");
        String result = helloFromC();
        Toast.makeText(getApplicationContext(), result, 0).show();
    }

    // 声明本地方法 使用native关键字 本地方法不用实现
    public native String helloFromC();
}

最后部署项目到模拟器

posted @ 2016-07-01 15:10  wuyudong  阅读(316)  评论(0编辑  收藏  举报
Top_arrow