Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android studio 下如何配置JNI環境

android studio 下如何配置JNI環境

編輯:關於Android編程

版本:Android stuido 2.2 windows 10操作系統

網上很多都是基於早期的eclipse環境配置的,studio的很少。以下是我親測可用的一個詳細過程。

安裝配置NDK

一般如果你是第一次做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文件:

這裡寫圖片描述

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved