2015-01-05 20 views
8

Tôi đã làm việc để nhận được một ứng dụng NDKSample rất đơn giản được xây dựng theo lượt đi qua here. Vấn đề của tôi là, tôi không thể tải Android Studio để tạo các tệp .so, vì vậy tôi không có thư viện nào.Tạo các tệp .so trong Android Studio 1.0.2 với NDK

Tôi hiểu rằng Hỗ trợ NDK không còn được dùng nữa và sẽ có một sự thay thế được cung cấp vào đầu năm nay, tuy nhiên dường như không có bất kỳ điều gì tích cực ngăn tôi sử dụng tính năng này. Khi tôi xây dựng dự án của tôi, tôi đưa ra các cảnh báo sau đây (Không phải là lỗi):

WARNING [Project: :app] Current NDK support is deprecated. Alternative will be provided in the future.

Dự án của tôi được xây dựng, nhưng khi tôi chạy .apk nó bị treo (như mong đợi) vì nó không thể tìm thấy các thư viện /. các tệp. Chúng tôi hy vọng chúng sẽ được tạo ra khi dự án được xây dựng, theo ví dụ, điều này có đúng không? Dưới đây là các lỗi:

java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.ndksample-1/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libMyLib.so"

Về môi trường của tôi

Windows 7, Android Studio 1.0.2, ADB đang chạy Nexus 5 (emulator-5554)

Mã của tôi

Theo ví dụ:

Đạo luật chính ivity.java

package com.example.ndksample; 

//import android.support.v7.app.ActionBarActivity; 
// This line is not needed as we are not targetting older devices 
import android.app.Activity; //Import this app package to use onCreate etc. 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.TextView; 


public class MainActivity extends Activity { 

    static{ 
     System.loadLibrary("MyLib"); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     TextView tv = (TextView) findViewById(R.id.my_textview); 
     tv.setText(getStringFromNative()); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    public native String getStringFromNative(); 
} 

activity_main.xml

<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:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

    <TextView 
     android:id="@+id/my_textview" 
     android:text="@string/hello_world" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</RelativeLayout> 

main.c

#include "com_example_ndksample_MainActivity.h" 
/* Header for class com_example_ndksample_MainActivity */ 

JNIEXPORT jstring JNICALL Java_com_example_ndksample_app_MainActivity_getStringFromNative 
    (JNIEnv * env, jobject obj) 
    { 
     return (*env)->NewStringUTF(env, "Hello from Kyle"); 
    } 

build.gradle lưu ý: ứng dụng

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.example.ndksample" 
     minSdkVersion 15 
     targetSdkVersion 21 
     versionCode 1 
     versionName "1.0" 

     ndk { 
      moduleName "MyLib" 
     } 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:21.0.3' 
} 

local.properties

## This file is automatically generated by Android Studio. 
# Do not modify this file -- YOUR CHANGES WILL BE ERASED! 
# 
# This file should *NOT* be checked into Version Control Systems, 
# as it contains information specific to your local configuration. 
# 
# Location of the SDK. This is only used by Gradle. 
# For customization when using a Version Control System, please read the 
# header note. 
sdk.dir=D\:\\Programs\\Android\\Android SDK 
ndk.dir=D\:\\Programs\\Android\\Android NDK 

Câu hỏi của tôi nếu có ai có thể giúp đỡ xin vui lòng:

Cuối cùng, làm thế nào để tạo ra các yêu cầu .so file !! ??

câu hỏi Sub có thể giúp đỡ trong việc trả lời câu hỏi chính:

bố trí thư mục My thăm tôi JNI dir dưới ứng dụng (để NDKSample/app/JNI), đây là đúng? Tôi đã được khuyên here không đặt các tệp c trong thư mục jni chuẩn. Tôi đã thử nghiệm điều này, và khi xây dựng dự án, nó đã bị hỏng. Lỗi:

* FAILURE: Xây dựng không thành công với ngoại lệ.

  • Điều gì đã xảy ra: Thực hiện không thành công cho công việc ': app: compileDebugNdk'.

    com.android.ide.common.internal.LoggedErrorException: Failed to run command: D:\Programs\Android\Android NDK\ndk-build.cmd NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=C:\Users\Kyle\AndroidStudioProjects\NDKSample\app\build\intermediates\ndk\debug\Android.mk APP_PLATFORM=android-21 NDK_OUT=C:\Users\Kyle\AndroidStudioProjects\NDKSample\app\build\intermediates\ndk\debug\obj NDK_LIBS_OUT=C:\Users\Kyle\AndroidStudioProjects\NDKSample\app\build\intermediates\ndk\debug\lib APP_ABI=all Error Code: 1*

Ví dụ từ Intel trên không trực tiếp tôi để xây dựng một tập tin Android.mk, ví dụ không và ông tạo ra một ứng dụng làm việc. Tôi đã thử đặt một trong thư mục jni, tuy nhiên nó không giúp đỡ. Tôi có nên tạo một cái hay không và nếu có, tôi nên đặt nó ở đâu

Hình ảnh dưới đây của thư mục của tôi có đúng không? Directories

Mọi trợ giúp sẽ được đánh giá cao.

Kyle

+0

Tôi có một câu hỏi tion về cách sử dụng các tệp .so trong dự án Android của tôi. Bạn có thể xem nó.https: //stackoverflow.com/questions/44929511/specify-so-files-in-build-gradle-file-android-studio –

Trả lời

13

hỗ trợ NDK hiện tại trong Android Studio là tối thiểu, do đó họ không dùng nó với 1.0.

Khi sử dụng, tệp Android.mk được tạo tự động và nguồn của bạn được biên dịch khi bạn tạo dự án. Ngay bây giờ có vẻ như việc biên dịch không thành công, nhưng bạn sẽ có thể nhận được thông báo lỗi ban đầu từ Gradle Console.

Nếu bạn không nhận được bất kỳ thông báo lỗi khác, tôi nghi ngờ rằng các cuộc gọi đến NDK-xây dựng là không bởi vì có một không gian bên trong đường dẫn cài đặt NDK của bạn (Android NDK)

Bạn có thể sửa chữa các lỗi hiện tại và tiếp tục thiết lập hiện tại của bạn, hoặc vô hiệu hóa việc tích hợp NDK mặc định, tạo Android.mk/Application.mk tập tin và gọi ndk-build (.cmd) cho bản thân hoặc từ một nhiệm vụ:

import org.apache.tools.ant.taskdefs.condition.Os 

android { 
    sourceSets.main { 
     jniLibs.srcDir 'src/main/libs' //set .so files location to libs 
     jni.srcDirs = [] //disable automatic ndk-build call 
    } 

    // call regular ndk-build(.cmd) script from app directory 
    task ndkBuild(type: Exec) { 
     if (Os.isFamily(Os.FAMILY_WINDOWS)) { 
      commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath 
     } else { 
      commandLine 'ndk-build', '-C', file('src/main').absolutePath 
     } 
    } 
    tasks.withType(JavaCompile) { 
     compileTask -> compileTask.dependsOn ndkBuild 
    } 
} 
+0

Xin chào @phOb, Cảm ơn bạn đã đứng đầu. Tôi đã loại bỏ khoảng trắng khỏi đường dẫn của mình, sau đó chuyển các tệp c vào thư mục jni mặc định dưới src/main/jni. Điều này tạo ra các tập tin .so, tuy nhiên Gradle bây giờ không đóng gói chúng vào .apk. Tôi đã cố gắng viết kịch bản để làm điều đó bản thân mình, nhưng nó cố gắng để sao chép các tập tin .so và nén để .jar trước khi nó thực sự tạo ra chúng. Niềm tin của tôi là điều này nên là một hệ thống khá tự động, và kịch bản những điều sâu này chỉ ra một vấn đề sâu sắc hơn? – KyleM

+0

tệp .class cho com.md.NDKSample.MainActivity nằm trong ứng dụng dir/build/intermediates/classes/debug, và như vậy các tệp .so được tạo ra đi tới ứng dụng dir/build/intermediates/ndk/debug/lib - Tuy nhiên, tôi chỉ có thể xem các tệp này khi tôi điều hướng trong Explorer; AndroidStudio chỉ hiển thị thư mục exploded-aar trong ứng dụng/xây dựng/trung gian - không có thư mục con nào khác như tài sản, lớp học, ndk, v.v. Đây có phải là vấn đề không? – KyleM

+0

ph0b, cảm ơn bạn. Tôi đã giải quyết điều này ngay bây giờ. Đó là một sự kết hợp của việc tạo ra các tập tin tiêu đề java từ thư mục sai (nên đã được gọi chúng từ ứng dụng/src/chính theo ví dụ của bạn, bất kể cấu trúc thư mục mới trong 1.0) và có khoảng trắng trong đường dẫn của tôi để ndk. Cảm ơn bạn. – KyleM

Các vấn đề liên quan