你的位置:首页 > 操作系统

[操作系统]Android jni helloworld


新建Android项目,设置布局:

<RelativeLayout ="http://schemas.android.com/apk/res/android"  ="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();}

最后部署项目到模拟器