新建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 1_JNIHelloworld
打开cmd
输入:cd /d F:workspace_sdk4 1_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(); }
最后部署项目到模拟器