新建Android項目,設置佈局: jni開發的步驟 ①寫java代碼 聲明本地方法 用到native關鍵字 本地方法不用去實現 ②項目根目錄下創建jni文件夾 ③在jni文件夾下創建.c文件 ④ 導入<jni.h> ⑤ 創建Android.mk makefile 告訴編譯器.c的源文件在什麼地方, ...
新建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(); }
最後部署項目到模擬器