今天我发现了一些项目,它们演示了android ndk编程。这是this projects
我正在尝试启动项目 DroidBlaster 。我编译了所有本机库而没有错误。结果如下:
我做了一些小改动:
1)。添加到application
选项AndroidManifest.xml
android:hasCode="true"
代码
2)。我从原生活动扩展并加载static
活动块中的所有库。
我这样做了,因为没有这些更改,android无法找到libdroidblaster.so
中声明的库AndroidManifest.xml
(这是来自作者的代码):
<activity
android:name="android.app.NativeActivity"
android:label="@string/app_name" >
<meta-data
android:name="android.app.lib_name"
android:value="droidblaster" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
现在我的AndroidManifest.xml
看起来像是:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.demo.droidblaster"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="22" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:hasCode="true">
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden">
<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"
android:label="@string/app_name" >
<meta-data
android:name="android.app.lib_name"
android:value="droidblaster" />
</activity>
</application>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
</manifest>
我的新活动:
public class MainActivity extends NativeActivity {
static {
System.loadLibrary("irrlicht");
System.loadLibrary("droidblaster");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
当我尝试启动应用时,我收到此错误:
06-05 12:56:26.523 11528-11528 / com.demo.droidblaster E / AndroidRuntime:致命异常:主要 处理:com.demo.droidblaster,PID:11528 java.lang.RuntimeException:无法启动活动ComponentInfo {com.demo.droidblaster / com.demo.droidblaster.MainActivity}: java.lang.IllegalArgumentException:无法找到本机库: 主要 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2658) 在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723) 在android.app.ActivityThread.access $ 900(ActivityThread.java:172) 在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1422) 在android.os.Handler.dispatchMessage(Handler.java:102) 在android.os.Looper.loop(Looper.java:145) 在android.app.ActivityThread.main(ActivityThread.java:5832) at java.lang.reflect.Method.invoke(Native Method) 在java.lang.reflect.Method.invoke(Method.java:372) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1399) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 引起:java.lang.IllegalArgumentException:无法找到本机库:main 在android.app.NativeActivity.onCreate(NativeActivity.java:170) 在com.demo.droidblaster.MainActivity.onCreate(MainActivity.java:17) 在android.app.Activity.performCreate(Activity.java:6221) 在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119) 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2611) 在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723) 在android.app.ActivityThread.access $ 900(ActivityThread.java:172) 在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1422) 在android.os.Handler.dispatchMessage(Handler.java:102) 在android.os.Looper.loop(Looper.java:145) 在android.app.ActivityThread.main(ActivityThread.java:5832) at java.lang.reflect.Method.invoke(Native Method) 在java.lang.reflect.Method.invoke(Method.java:372) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1399) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
所以,原因是:
java.lang.IllegalArgumentException: Unable to find native library: main
我无法找到解决此问题的解决方案。
有谁知道如何修复它?
答案 0 :(得分:1)
.so
个文件。按照此处给出的答案将其包括在内:https://stackoverflow.com/a/17131418/1395437
答案 1 :(得分:0)
您可以尝试使用ndk-support集成(experemental)安装新的gradle。 http://ph0b.com/new-android-studio-ndk-support/#more-236 会有android.ndk框(在你的gradle.build中)你应该添加native_android_glue:
android.ndk {
moduleName = "droidblaster"
CFlags.add("-I${file("src/main/jni/android_native_app_glue")}".toString())
ldLibs.addAll(["log", "android", "EGL", "GLESv1_CM"])
}
答案 2 :(得分:0)
externalNativeBuild {
cmake {
arguments "-DANDROID_STL=c++_shared" //add this in the build.gradle
}
}
答案 3 :(得分:0)
我认为您必须删除第二个活动并将此标签<meta-data android:name="android.app.lib_name" android:value="droidblaster" />
添加到第一个活动
答案 4 :(得分:-1)
将NativeActivity更改为AppCompatActivity。