編輯:關於Android編程
版本:Android stuido 2.2 windows 10操作系統
網上很多都是基於早期的eclipse環境配置的,studio的很少。以下是我親測可用的一個詳細過程。
一般如果你是第一次做jni的開發,studio的環境應該是沒有ndk的,需要安裝。在tools-android-sdk manager,進入sdk-tools選項,然後選中NDK進行安裝。
默認安裝在了
C:\android\sdk\android-sdk-windows\ndk-bundle<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPsi7uvPF5NbDz8K7t76zseTBvzo8YnIgLz4NCtDC1PZOREtfUk9PVKOsdmFsdWXOqjo8YnIgLz4NCkM6XGFuZHJvaWRcc2RrXGFuZHJvaWQtc2RrLXdpbmRvd3NcbmRrLWJ1bmRsZTwvcD4NCjxwPsi7uvPU2nBhdGjW0NT2vNMlTkRLX1JPT1QlPC9wPg0KPHA+PGltZyBhbHQ9"這裡寫圖片描述" src="/uploadfile/Collfiles/20160919/20160919093621259.png" title="\" />
新建一個工程,名為ssl_socket,package的全路徑是com.example.pony.ssl_socket(很重要,後面會用到)。
我的MainActivity.java源碼如下:
package com.example.pony.ssl_socket; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; //聲明native方法 public native String getStringFromNative(); // static表示在系統第一次加載類的時候,先執行這一段代碼,在這裡表示加載動態庫libHelloWorldJni.so文件 static { Log.i(TAG, "loadLibrary"); System.loadLibrary("helloNDK"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i(TAG, "onCreate"); Log.i(TAG, getStringFromNative()); } }
public native String getStringFromNative();
這一行是聲明一個native方法,也是我們一會在.c文件中要實現的方法。
System.loadLibrary(“helloNDK”);
這是讓類啟動時,加載名為helloNDK的模塊,這是我們的jni模塊名,這個名字和後面ndk編譯時指定的名字一致。
編輯gradle.properties文件,增加:
android.useDeprecatedNdk=true
編輯app下的build.gradle,增加:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include/* Header for class com_example_pony_ssl_socket_MainActivity */ #ifndef _Included_com_example_pony_ssl_socket_MainActivity #define _Included_com_example_pony_ssl_socket_MainActivity #ifdef __cplusplus extern "C" { #endif #undef com_example_pony_ssl_socket_MainActivity_BIND_ABOVE_CLIENT #define com_example_pony_ssl_socket_MainActivity_BIND_ABOVE_CLIENT 8L #undef com_example_pony_ssl_socket_MainActivity_BIND_ADJUST_WITH_ACTIVITY #define com_example_pony_ssl_socket_MainActivity_BIND_ADJUST_WITH_ACTIVITY 128L #undef com_example_pony_ssl_socket_MainActivity_BIND_ALLOW_OOM_MANAGEMENT #define com_example_pony_ssl_socket_MainActivity_BIND_ALLOW_OOM_MANAGEMENT 16L #undef com_example_pony_ssl_socket_MainActivity_BIND_AUTO_CREATE #define com_example_pony_ssl_socket_MainActivity_BIND_AUTO_CREATE 1L #undef com_example_pony_ssl_socket_MainActivity_BIND_DEBUG_UNBIND #define com_example_pony_ssl_socket_MainActivity_BIND_DEBUG_UNBIND 2L #undef com_example_pony_ssl_socket_MainActivity_BIND_EXTERNAL_SERVICE #define com_example_pony_ssl_socket_MainActivity_BIND_EXTERNAL_SERVICE -2147483648L #undef com_example_pony_ssl_socket_MainActivity_BIND_IMPORTANT #define com_example_pony_ssl_socket_MainActivity_BIND_IMPORTANT 64L #undef com_example_pony_ssl_socket_MainActivity_BIND_NOT_FOREGROUND #define com_example_pony_ssl_socket_MainActivity_BIND_NOT_FOREGROUND 4L #undef com_example_pony_ssl_socket_MainActivity_BIND_WAIVE_PRIORITY #define com_example_pony_ssl_socket_MainActivity_BIND_WAIVE_PRIORITY 32L #undef com_example_pony_ssl_socket_MainActivity_CONTEXT_IGNORE_SECURITY #define com_example_pony_ssl_socket_MainActivity_CONTEXT_IGNORE_SECURITY 2L #undef com_example_pony_ssl_socket_MainActivity_CONTEXT_INCLUDE_CODE #define com_example_pony_ssl_socket_MainActivity_CONTEXT_INCLUDE_CODE 1L #undef com_example_pony_ssl_socket_MainActivity_CONTEXT_RESTRICTED #define com_example_pony_ssl_socket_MainActivity_CONTEXT_RESTRICTED 4L #undef com_example_pony_ssl_socket_MainActivity_MODE_APPEND #define com_example_pony_ssl_socket_MainActivity_MODE_APPEND 32768L #undef com_example_pony_ssl_socket_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING #define com_example_pony_ssl_socket_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L #undef com_example_pony_ssl_socket_MainActivity_MODE_MULTI_PROCESS #define com_example_pony_ssl_socket_MainActivity_MODE_MULTI_PROCESS 4L #undef com_example_pony_ssl_socket_MainActivity_MODE_NO_LOCALIZED_COLLATORS #define com_example_pony_ssl_socket_MainActivity_MODE_NO_LOCALIZED_COLLATORS 16L #undef com_example_pony_ssl_socket_MainActivity_MODE_PRIVATE #define com_example_pony_ssl_socket_MainActivity_MODE_PRIVATE 0L #undef com_example_pony_ssl_socket_MainActivity_MODE_WORLD_READABLE #define com_example_pony_ssl_socket_MainActivity_MODE_WORLD_READABLE 1L #undef com_example_pony_ssl_socket_MainActivity_MODE_WORLD_WRITEABLE #define com_example_pony_ssl_socket_MainActivity_MODE_WORLD_WRITEABLE 2L #undef com_example_pony_ssl_socket_MainActivity_DEFAULT_KEYS_DIALER #define com_example_pony_ssl_socket_MainActivity_DEFAULT_KEYS_DIALER 1L #undef com_example_pony_ssl_socket_MainActivity_DEFAULT_KEYS_DISABLE #define com_example_pony_ssl_socket_MainActivity_DEFAULT_KEYS_DISABLE 0L #undef com_example_pony_ssl_socket_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL #define com_example_pony_ssl_socket_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L #undef com_example_pony_ssl_socket_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL #define com_example_pony_ssl_socket_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L #undef com_example_pony_ssl_socket_MainActivity_DEFAULT_KEYS_SHORTCUT #define com_example_pony_ssl_socket_MainActivity_DEFAULT_KEYS_SHORTCUT 2L #undef com_example_pony_ssl_socket_MainActivity_RESULT_CANCELED #define com_example_pony_ssl_socket_MainActivity_RESULT_CANCELED 0L #undef com_example_pony_ssl_socket_MainActivity_RESULT_FIRST_USER #define com_example_pony_ssl_socket_MainActivity_RESULT_FIRST_USER 1L #undef com_example_pony_ssl_socket_MainActivity_RESULT_OK #define com_example_pony_ssl_socket_MainActivity_RESULT_OK -1L #undef com_example_pony_ssl_socket_MainActivity_MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS #define com_example_pony_ssl_socket_MainActivity_MAX_NUM_PENDING_FRAGMENT_ACTIVITY_RESULTS 65534L #undef com_example_pony_ssl_socket_MainActivity_HONEYCOMB #define com_example_pony_ssl_socket_MainActivity_HONEYCOMB 11L #undef com_example_pony_ssl_socket_MainActivity_MSG_REALLY_STOPPED #define com_example_pony_ssl_socket_MainActivity_MSG_REALLY_STOPPED 1L #undef com_example_pony_ssl_socket_MainActivity_MSG_RESUME_PENDING #define com_example_pony_ssl_socket_MainActivity_MSG_RESUME_PENDING 2L /* * Class: com_example_pony_ssl_socket_MainActivity * Method: getStringFromNative * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_pony_ssl_1socket_MainActivity_getStringFromNative (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
重點是Java_com_example_pony_ssl_1socket_MainActivity_getStringFromNative這個方法的聲明。它的規則是
Java_ + 類的全限定名,用下劃線進行分隔 + 方法名,
這樣jvm運行的時候根據這個命名規則去找到對應的native方法。
然後在jni目錄新建一個jni.c文件(名字隨便取),源碼如下:
#include/* Header for class com_example_pony_ssl_socket_MainActivity */ #ifndef _Included_com_example_pony_ssl_socket_MainActivity #define _Included_com_example_pony_ssl_socket_MainActivity #ifdef __cplusplus extern "C" { #endif JNIEXPORT jstring JNICALL Java_com_example_pony_ssl_1socket_MainActivity_getStringFromNative (JNIEnv *env, jobject jobj) { return (*env)->NewStringUTF(env,"Hello From JNI!"); } #ifdef __cplusplus } #endif #endif
所有的本地方法的第一個參數都是指向JNIEnv結構的。這個結構是用來調用JNI函數的。
編輯運行,可以在輸出窗口看到:
Hello From JNI!
同時,c文件也生成了.so文件:
手機qq聊天記錄裡有重要的信息要怎麼導出?手機qq聊天記錄保存在哪個文件夾,我們一起來看看吧!手機qq導出聊天記錄方法:一、導出與好友的聊天記錄: 操作方
今天在項目中用到了android中常用的RadioGroup、RadioButton、Spinner、EditText等控件,在此介紹一下它們的用法,希望對
今天有一個Android新手使用strings.xml進行格式化的時候報了占位符錯誤, Multiple substitutions specified in non-
Accessibility是Android從API 4開始提供的一個功能,它主要目的是幫助一些因為有視覺,聽覺,身體障礙而無法完全使用觸摸屏或鈴聲等的用戶來使用Andro