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?
Mọi trợ giúp sẽ được đánh giá cao.
Kyle
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 –