2012-02-24 56 views
1

我努力在NDK中以C++ OpenGL ES的方式運行完全本機的代碼。Android C++ OpenGL:無法找到統計信息

這個想法是完全避免需要在Android項目中擁有大量與接口過程相關的java類的文件夾/ src,從而提高嵌入式系統的速度和性能。因此,我們將在/ jni下將整個程序作爲本機C++。

它需要使用Android的NativeActivity的的 - 例如參見: http://www.srombauts.fr/2011/03/01/android-2-3-nativeactivityAndroid NativeActivity

對於這一點,該/ SRC被刪除,並且還AndroidManifest.xml中被移動到項目的根和相應的修改:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.packtpub.program3D" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-feature android:glEsVersion="0x00020000"></uses-feature> 
    <uses-sdk android:targetSdkVersion="15" android:minSdkVersion="15"></uses-sdk> 

    <application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 

    <activity android:name="android.app.NativeActivity" 
     android:label="@string/app_name"> 
     <meta-data android:name="android.app.lib_name" 
      android:value="program3D"/> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category 
       android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 

    </application> 
</manifest> 

的在AndroidManifest.xml「使用特徵」必須是爲「glEsVersion」參數指定爲「0x00020000」,否則NDK將使用默認的1.0版本。

在Android.mk,程序應具有android_native_app_glue,包括它作爲參數編譯並生成:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := program3D 
LOCAL_SRC_FILES := com_packtpub_program3D.c program3D.c 
LOCAL_LDLIBS := -landroid -llog -lEGL -lGLESv1_CM 
LOCAL_STATIC_LIBRARIES := android_native_app_glue 
include $(BUILD_SHARED_LIBRARY) 

$(call import-module,android/native_app_glue) 

的C/C++代碼放置在/jni/Main.cpp。在這裏你可以訪問一個可用於測試目的的模板程序,它放在Main.cpp中:http://developer.android.com/reference/android/app/NativeActivity.html

建設和編譯沒有任何問題,只是很好。這裏是輸出:

**** Build of configuration Default for project program3D **** 

ndk-build NDK_DEBUG=1 V=1 all 
rm -f ./libs/x86/lib*.so ./libs/armeabi/lib*.so ./libs/armeabi-v7a/lib*.so 
rm -f ./libs/x86/gdbserver ./libs/armeabi/gdbserver ./libs/armeabi-v7a/gdbserver 
rm -f ./libs/x86/gdb.setup ./libs/armeabi/gdb.setup ./libs/armeabi-v7a/gdb.setup 
Gdbserver  : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver 
mkdir -p ./libs/armeabi 
install -p /opt/android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver ./libs/armeabi/gdbserver 
Gdbsetup  : libs/armeabi/gdb.setup 
mkdir -p ./libs/armeabi 
echo "set solib-search-path ./obj/local/armeabi" > ./libs/armeabi/gdb.setup 
echo "directory /opt/android/android-ndk-r7/platforms/android-14/arch-arm/usr/include /opt/android/android-ndk-r7/sources/android/native_app_glue /opt/android/android-ndk-r7/sources/cxx-stl/system/include jni" >> ./libs/armeabi/gdb.setup 
Install  : libprogram3D.so => libs/armeabi/libprogram3D.so 
mkdir -p ./libs/armeabi 
install -p ./obj/local/armeabi/libprogram3D.so ./libs/armeabi/libprogram3D.so 
/opt/android/android-ndk-r7/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-strip --strip-unneeded ./libs/armeabi/libprogram3D.so 

**** Build Finished **** 

太棒了!對?不完全是。

當被要求運行...它根本不會啓動。相反,在僅logcat中出現以下encryptic消息,該程序不會在設備加載或運行:

system_process : ThrottleSercie : unable to find stats for iface rmnet0 

什麼可以丟失,鑑於該程序調試和編譯很好。

有人可能有什麼建議嗎?所有意見都非常感謝。

回答

1

我認爲logcat消息是一個紅鯡魚。

你的JNI庫似乎被命名爲libprogram3D.so,但你在清單XML中調用它「droidblaster」(這是操作系統用來加載.so的東西)。嘗試改變一個,讓它們匹配。

+0

Hello Reuben ...我按照你的建議正確檢查和更新了它。輸出仍然是一樣的。 – ThreaderSlash 2012-02-24 13:23:38

+0

在模塊入口點放置一行調試跟蹤。如果它不出現在logcat中,則知道.so沒有被加載。 – 2012-02-24 13:58:01

+0

我已經把「ndk-build NDK_DEBUG = 1 V = 1 all」。可以使用哪些其他額外參數來追蹤問題? – ThreaderSlash 2012-02-24 14:08:28