本節(jié)內(nèi)容是:演示搭建第1個NDK程序
直接創(chuàng)建1個新的Android Application Project便可~
package com.jay.example.firstndk;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button btnShow;
// 聲明native方法
public native String javaFromJNI();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnShow = (Button) findViewById(R.id.btnShow);
btnShow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, javaFromJNI(),
Toast.LENGTH_SHORT).show();
}
});
}
}
這里要注意的地方有兩個:
①返回值類型
jni.h文件中中事前定義的數(shù)據(jù)類型,我們可以在ndk/platforms/android-xx/arch-arm/user/include目錄下找到,~xx代表版本號
打開jni.h我們會看到很多數(shù)據(jù)類型,我們這里的是string:
②方法名:依照下述規(guī)則:
返回值類型 Java_包名_類名_native方法名(JNIEnv* env, jobject obj)
而里頭的參數(shù)是固定的,在jni.h文件我們也能夠查到,他是1個叫做JNINativeInterface的結(jié)構(gòu)體,結(jié)構(gòu)體中定義了很多數(shù)據(jù)類型,我們找到那個返回字符串的:
好的,那末接下來我們把我們的c代碼寫完,我們在jni目錄下創(chuàng)建1個叫first.c的文件:
#include<stdio.h>
#include<jni.h>
jstring Java_com_jay_example_firstndk_MainActivity_javaFromJNI(JNIEnv* env, jobject obj) {
return (*env)->NewStringUTF(env, "First Blood~");
}
工程右鍵->Android Tools ->Add Native Support輸入so庫名稱:
自己給so庫命名:
這個時候會看到,jni目錄下除我們自己編寫的c文件外,還多了兩個東東,xx.cpp和Android.mk文件,那個cpp可以直接刪掉,接著打開Android.mk件,修改下東西:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := FirstNDK
LOCAL_SRC_FILES := first.c
include $(BUILD_SHARED_LIBRARY)
ps:其實這步可以直接在3就進行,會直接生成1個.cpp與Android.mk的文件的~
右鍵Project->Properties->Builders->New,新建1個Builder,在彈出的對話框上面點擊Program,OK!如圖所示
雙擊打開,進行配置:
點擊肯定,OK,好了,接下來就能夠自定編譯代碼了~比如我們修改代碼后保存,他都會重新編譯下.so
好了,第1個NDK程序就這樣完成了,中途磕磕碰碰遇到很多問題,總算是順利地跑起來了,下面歸納下大概步驟:
好了,大概進程就如上面所述~可能還有其他快捷的創(chuàng)建方法吧,后續(xù)遇到的話在給大家介紹哈~最后附上弄這個程序時遇到的1些問題和解決方法!
1.運行后程序直接死掉- -,后來查log發(fā)現(xiàn)是c那里方法名寫錯了,直接報方法找不到!
解決方法:嚴格依照下述規(guī)定寫
返回值類型 Java_包名_類名_native方法名(JNIEnv* env, jobject obj)
2.出現(xiàn)這樣的提示:
Android NDK: WARNING: APP_PLATFORM android⑴7 is larger than android:minSdkVersion 14 in ./AndroidManifest.xml
解決方法:
android-ndk-r8e/build/core/add-application.mk第128行把__ndk_warning改成__ndk_info;然后重新build1次項目便可消除毛病。
或,直接寫成這樣…我們公司是這樣做的…感覺這樣雖然不報錯,但是不好…
3.用c來寫的出現(xiàn):Method ‘NewStringUTF’ could not be resolved
就是找不到方法,真奇葩…
解決方法:
比如我的路徑是:
E:NDKandroid-ndk-r10dplatformsandroid⑴7arch-armusrinclude
4.如果你用的是.cpp的話,出現(xiàn)3的問題
解決方法:為供Java調(diào)用的c++函數(shù)前加入extern “C” 修飾
另外輸出字符串的語句也是不1樣的:
(*env)->Method(env, XXX)改成env->Method(XXX)便可.
上一篇 DRP問題集結(jié)(一)-Tomcat無法啟動,報錯java.lang.NoClassDefFoundError: org/apache/juli/logging/
下一篇 uml精粹――3.類圖(必需)