使用 ndk-build 构建 NativeActivity
Build NativeActivity using ndk-build
我试图在从 java 正常启动后启动本机 activity(我需要加载另一个库,这就是我从 java 启动本机 Activity 的原因).
如何使用 Android.mk 构建示例?原始样本使用 gradle。我尝试构建它,但在启动时库无法加载。
FATAL EXCEPTION: main Process: sample.simple.com.myapplication, PID: 14917
java.lang.RuntimeException: Unable to start activity ComponentInfo{sample.simple.com.myapplication/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app/sample.simple.com.myapplication/lib/arm64/libnActivity.so
以下是代码片段。
Android.mk 通过关注 http://brian.io/android-ndk-r10c-docs/Programmers_Guide/html/md_2__samples_sample--nativeactivity.html
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := nActivity
LOCAL_SRC_FILES := main.c
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := android_native_app_glue
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)
Java Activity
public class DummyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.loadLibrary("nActivity");
Intent intent = new Intent(DummyActivity.this, android.app.NativeActivity.class);
DummyActivity.this.startActivity(intent);
// setContentView(R.layout.activity_dummy);
}
}
Android 清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="display.rendering.simple.com.myapplication">
<application android:label="@string/app_name" android:hasCode="true">
<activity android:name="DummyActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="android.app.NativeActivity">
<meta-data android:name="android.app.lib_name"
android:value="nActivity" />
</activity>
</application>
</manifest>
build.gradle
ndk{
moduleName ="nActivity"
}
sourceSets.main {
jni.srcDirs = []
jni.srcDir "src/main/libs"
}
谢谢
您的 build.gradle 在此处禁用了对 ndk-build 的内置调用:
jni.srcDirs = []
这意味着实际上没有构建本机库。没有库 -> 设备上没有具有匹配名称的库 -> loadLibrary 错误。
您不一定需要使用 Android.mk 文件从 Java 启动 native-activity。另一个 NDK samples document how to build and use native code with build.gradle. The build.gradle file from hello-jni 是一个很好的起点。
除非万不得已,否则我建议不要使用 Android.mk,但如果需要,也有 NDK samples 使用 Android.mk。
我试图在从 java 正常启动后启动本机 activity(我需要加载另一个库,这就是我从 java 启动本机 Activity 的原因).
如何使用 Android.mk 构建示例?原始样本使用 gradle。我尝试构建它,但在启动时库无法加载。
FATAL EXCEPTION: main Process: sample.simple.com.myapplication, PID: 14917
java.lang.RuntimeException: Unable to start activity ComponentInfo{sample.simple.com.myapplication/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/app/sample.simple.com.myapplication/lib/arm64/libnActivity.so
以下是代码片段。
Android.mk 通过关注 http://brian.io/android-ndk-r10c-docs/Programmers_Guide/html/md_2__samples_sample--nativeactivity.html
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := nActivity
LOCAL_SRC_FILES := main.c
LOCAL_LDLIBS := -llog -landroid -lEGL -lGLESv1_CM
LOCAL_STATIC_LIBRARIES := android_native_app_glue
include $(BUILD_SHARED_LIBRARY)
$(call import-module,android/native_app_glue)
Java Activity
public class DummyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.loadLibrary("nActivity");
Intent intent = new Intent(DummyActivity.this, android.app.NativeActivity.class);
DummyActivity.this.startActivity(intent);
// setContentView(R.layout.activity_dummy);
}
}
Android 清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="display.rendering.simple.com.myapplication">
<application android:label="@string/app_name" android:hasCode="true">
<activity android:name="DummyActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="android.app.NativeActivity">
<meta-data android:name="android.app.lib_name"
android:value="nActivity" />
</activity>
</application>
</manifest>
build.gradle
ndk{
moduleName ="nActivity"
}
sourceSets.main {
jni.srcDirs = []
jni.srcDir "src/main/libs"
}
谢谢
您的 build.gradle 在此处禁用了对 ndk-build 的内置调用:
jni.srcDirs = []
这意味着实际上没有构建本机库。没有库 -> 设备上没有具有匹配名称的库 -> loadLibrary 错误。
您不一定需要使用 Android.mk 文件从 Java 启动 native-activity。另一个 NDK samples document how to build and use native code with build.gradle. The build.gradle file from hello-jni 是一个很好的起点。
除非万不得已,否则我建议不要使用 Android.mk,但如果需要,也有 NDK samples 使用 Android.mk。