运行 ADT 中的 googlevr TreasureHunt 示例应用
running googlevr TreasureHunt sample app in ADT
我需要将 GoogleVR 支持集成到使用 Eclipse 中的 ADT 工具链构建的现有项目中。
到目前为止,我已经提取了 base.aar 和 common.aar(来自 Gradle),将 classes.jar 移动到具有唯一名称的 "libs" 文件夹中( base-classes.jar, 等), 用"New Android Project From Existing Sources" 工具创建了一个库项目, 并将它们作为依赖库项目附加到主应用程序。
这似乎构建正常,并且至少可以进入 "main" 初始屏幕 activity 就好了,但是,当我尝试像这样激活 GvrActivity 时,应用程序在运行时崩溃:
Intent intent = new Intent(this, FinditVRActivity.class);
startActivity(intent);
...其中 FinditVRActivity 本质上是一个空白的 GvrActivity,带有几行 GL 以设置背景颜色(又名 "hello world")...应用程序崩溃并出现以下错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.YourCompany.Findit3D/com.YourCompany.Findit3D.FinditVRActivity}: android.view.InflateException: Binary XML file line #9: Error inflating class com.google.vr.sdk.base.GvrView
这是崩溃前日志的最后几位...
07-07 12:42:01.466: D/Activity(8246): performCreate Call secproduct feature valuefalse
07-07 12:42:01.466: D/Activity(8246): performCreate Call debug elastic valuetrue
07-07 12:42:01.656: D/CardboardViewNativeImpl(8246): NativeProxy not found
07-07 12:42:01.656: D/CardboardViewNativeImpl(8246): Loading native library gvrbase
我确实确认 Android Studio 中的股票示例在我的测试设备上工作,所以这不应该是问题所在。我假设我在 ADT 的项目链接中遗漏了一些东西,但我不确定是什么。我有什么想法可以从这里开始吗?
感谢您的宝贵时间!
编辑
删除了 startActivity 示例中不需要的代码
edit2 注意:所有项目都禁用 ProGuard
edit3
我做了一些进一步的挖掘,并将崩溃的范围缩小到以下代码示例。
正如预期的那样,此示例 activity 将在启动时设置蓝色背景。
public class FinditVRActivity extends GvrActivity {
private GLSurfaceView _glSurfaceView;
public static class GLRenderer implements Renderer {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// No-op
}
@Override
public void onDrawFrame(GL10 gl) {
glClear(GL_COLOR_BUFFER_BIT);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_glSurfaceView = new GLSurfaceView(this);
_glSurfaceView.setEGLContextClientVersion(2);
_glSurfaceView.setRenderer(new GLRenderer());
setContentView(_glSurfaceView);
}
@Override
protected void onPause() {
super.onPause();
_glSurfaceView.onPause();
}
@Override
protected void onResume() {
super.onResume();
_glSurfaceView.onResume();
}
}
这个类似的 activity 使用 GrvView 崩溃并出现 new 错误,这至少看起来更接近目标。
public class FinditVRActivity extends GvrActivity {
private GvrView _gvrView;
public static class GVRRenderer implements GvrView.StereoRenderer {
@Override
public void onSurfaceCreated(EGLConfig config) {
glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
}
@Override
public void onNewFrame(HeadTransform headTransform) {
glClear(GL_COLOR_BUFFER_BIT);
}
@Override
public void onSurfaceChanged(int width, int height) {}
@Override
public void onFinishFrame(Viewport viewport) {}
@Override
public void onDrawEye(Eye eye) {}
@Override
public void onRendererShutdown() {}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_gvrView = new GvrView(this);
_gvrView.setEGLContextClientVersion(2);
_gvrView.setRenderer(new GVRRenderer());
setContentView(_gvrView);
}
@Override
protected void onPause() {
super.onPause();
_gvrView.onPause();
}
@Override
protected void onResume() {
super.onResume();
_gvrView.onResume();
}
}
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.YourCompany.Findit3D-1/base.apk"],nativeLibraryDirectories=[/data/app/com.YourCompany.Findit3D-1/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libgvrbase.so"
我实际上并没有在构建工件的任何地方看到 libgvrbase.so,所以看起来 @Morrison Chang 的假设是正确的。
这是否位于另一个库 .aar 包中?
再次感谢!
您提到您正在从现有的 .aar 文件中手动提取以构建您的项目。应用程序崩溃前显示的logcat:
07-07 12:42:01.656: D/CardboardViewNativeImpl(8246): NativeProxy not found
07-07 12:42:01.656: D/CardboardViewNativeImpl(8246): Loading native library gvrbase
暗示 CardboardViewNativeImpl
中的 NativeProxy
缺失,这就是我建议检查 JNI 库的原因。
根据您的回复,您似乎已经找到合适的文件并将它们放入您的 project/libraries 中,这样您就可以使用 ADT 正确构建。
** 更新 **
准备好一切的最后步骤 运行 非常复杂,因此我已将我的工作发布到 GitHub,以作为那些可能在未来。在撰写本文时,这项工作仍在进行中。有关详细信息,请参阅活跃问题。
我需要将 GoogleVR 支持集成到使用 Eclipse 中的 ADT 工具链构建的现有项目中。
到目前为止,我已经提取了 base.aar 和 common.aar(来自 Gradle),将 classes.jar 移动到具有唯一名称的 "libs" 文件夹中( base-classes.jar, 等), 用"New Android Project From Existing Sources" 工具创建了一个库项目, 并将它们作为依赖库项目附加到主应用程序。
这似乎构建正常,并且至少可以进入 "main" 初始屏幕 activity 就好了,但是,当我尝试像这样激活 GvrActivity 时,应用程序在运行时崩溃:
Intent intent = new Intent(this, FinditVRActivity.class);
startActivity(intent);
...其中 FinditVRActivity 本质上是一个空白的 GvrActivity,带有几行 GL 以设置背景颜色(又名 "hello world")...应用程序崩溃并出现以下错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.YourCompany.Findit3D/com.YourCompany.Findit3D.FinditVRActivity}: android.view.InflateException: Binary XML file line #9: Error inflating class com.google.vr.sdk.base.GvrView
这是崩溃前日志的最后几位...
07-07 12:42:01.466: D/Activity(8246): performCreate Call secproduct feature valuefalse
07-07 12:42:01.466: D/Activity(8246): performCreate Call debug elastic valuetrue
07-07 12:42:01.656: D/CardboardViewNativeImpl(8246): NativeProxy not found
07-07 12:42:01.656: D/CardboardViewNativeImpl(8246): Loading native library gvrbase
我确实确认 Android Studio 中的股票示例在我的测试设备上工作,所以这不应该是问题所在。我假设我在 ADT 的项目链接中遗漏了一些东西,但我不确定是什么。我有什么想法可以从这里开始吗?
感谢您的宝贵时间!
编辑 删除了 startActivity 示例中不需要的代码
edit2 注意:所有项目都禁用 ProGuard
edit3
我做了一些进一步的挖掘,并将崩溃的范围缩小到以下代码示例。
正如预期的那样,此示例 activity 将在启动时设置蓝色背景。
public class FinditVRActivity extends GvrActivity {
private GLSurfaceView _glSurfaceView;
public static class GLRenderer implements Renderer {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// No-op
}
@Override
public void onDrawFrame(GL10 gl) {
glClear(GL_COLOR_BUFFER_BIT);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_glSurfaceView = new GLSurfaceView(this);
_glSurfaceView.setEGLContextClientVersion(2);
_glSurfaceView.setRenderer(new GLRenderer());
setContentView(_glSurfaceView);
}
@Override
protected void onPause() {
super.onPause();
_glSurfaceView.onPause();
}
@Override
protected void onResume() {
super.onResume();
_glSurfaceView.onResume();
}
}
这个类似的 activity 使用 GrvView 崩溃并出现 new 错误,这至少看起来更接近目标。
public class FinditVRActivity extends GvrActivity {
private GvrView _gvrView;
public static class GVRRenderer implements GvrView.StereoRenderer {
@Override
public void onSurfaceCreated(EGLConfig config) {
glClearColor(0.0f, 0.0f, 1.0f, 0.0f);
}
@Override
public void onNewFrame(HeadTransform headTransform) {
glClear(GL_COLOR_BUFFER_BIT);
}
@Override
public void onSurfaceChanged(int width, int height) {}
@Override
public void onFinishFrame(Viewport viewport) {}
@Override
public void onDrawEye(Eye eye) {}
@Override
public void onRendererShutdown() {}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
_gvrView = new GvrView(this);
_gvrView.setEGLContextClientVersion(2);
_gvrView.setRenderer(new GVRRenderer());
setContentView(_gvrView);
}
@Override
protected void onPause() {
super.onPause();
_gvrView.onPause();
}
@Override
protected void onResume() {
super.onResume();
_gvrView.onResume();
}
}
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.YourCompany.Findit3D-1/base.apk"],nativeLibraryDirectories=[/data/app/com.YourCompany.Findit3D-1/lib/arm, /vendor/lib, /system/lib]]] couldn't find "libgvrbase.so"
我实际上并没有在构建工件的任何地方看到 libgvrbase.so,所以看起来 @Morrison Chang 的假设是正确的。
这是否位于另一个库 .aar 包中?
再次感谢!
您提到您正在从现有的 .aar 文件中手动提取以构建您的项目。应用程序崩溃前显示的logcat:
07-07 12:42:01.656: D/CardboardViewNativeImpl(8246): NativeProxy not found
07-07 12:42:01.656: D/CardboardViewNativeImpl(8246): Loading native library gvrbase
暗示 CardboardViewNativeImpl
中的 NativeProxy
缺失,这就是我建议检查 JNI 库的原因。
根据您的回复,您似乎已经找到合适的文件并将它们放入您的 project/libraries 中,这样您就可以使用 ADT 正确构建。
** 更新 **
准备好一切的最后步骤 运行 非常复杂,因此我已将我的工作发布到 GitHub,以作为那些可能在未来。在撰写本文时,这项工作仍在进行中。有关详细信息,请参阅活跃问题。