在本文中,我们将详细介绍使用hash_map时,我在androidNDK上遇到了complition错误_GLIBCXX_PERMIT_BACKWARD_HASH的各个方面,同时,我们也将为您带来关于
在本文中,我们将详细介绍使用hash_map时,我在android NDK上遇到了complition错误_GLIBCXX_PERMIT_BACKWARD_HASH的各个方面,同时,我们也将为您带来关于Android ''showAsAction'' in package ''android''错误解决、Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu、Android NDK C异常引发SIGSEGV和__gnu_cxx :: __ verbose_terminate_handler、Android NDK UnsatisfiedLinkError:“dlopen失败:空/丢失DT_HASH”的有用知识。
本文目录一览:- 使用hash_map时,我在android NDK上遇到了complition错误_GLIBCXX_PERMIT_BACKWARD_HASH
- Android ''showAsAction'' in package ''android''错误解决
- Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu
- Android NDK C异常引发SIGSEGV和__gnu_cxx :: __ verbose_terminate_handler
- Android NDK UnsatisfiedLinkError:“dlopen失败:空/丢失DT_HASH”
使用hash_map时,我在android NDK上遇到了complition错误_GLIBCXX_PERMIT_BACKWARD_HASH
我用谷歌搜索我需要在Android NDK和win32上的不同来源中包含它,如下所示:
#ifdef __GNUC__ #include <ext/hash_map> #else #include <hash_map> #endif
但是,当我在NDK r7b上编译时,我遇到了编译错误:
D:/Developer/Android/android-ndk-r7b/sources/cxx-stl/gnu-libstdc++/include/ext/hash_map:60:30: error: backward_warning.h: No such file or directory
它无法包含backward_warning.h文件
#ifndef _GLIBCXX_PERMIT_BACKWARD_HASH #include "backward_warning.h" #endif
我怎么解决这个问题?
解决方法
LOCAL_CFLAGS := -D_GLIBCXX_PERMIT_BACKWARD_HASH
Android ''showAsAction'' in package ''android''错误解决
将工程引入到eclipse里面, 发现这个错误:
No resource identifier found for attribute ''showAsAction'' in package ''android''。
解决办法:
删除两个文件values-v11、values-v14
删除了menu文件,因为没用menu。
搞定,具体原因不清楚 不知道为什么这样可以
Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu
Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu
Android早期推出的ActionBarActivity被Android谷歌官方废弃,推荐使用AppCompatActivity替代ActionBarActivity。在实际的开发中现在也基本上不再怎么使用ActionBar,而是使用最新的Toolbar替代ActionBar了,但是ActionBar也有其自身比较有特点的地方,比如ActionBar自身对SearchView,ShareActionProvider的良好支持,使得ActionBar在某些应用开发场景中依然有其用武之地。
现在给出一个例子说明如何在一个ActionBar中实现SearchView和ShareActionProvider。
先把完整的代码实现给出,然后结合代码加以说明。
测试用的主Activity,MainActivity.java:
package zhangphil.toolbar;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.MenuItemCompat.OnActionExpandListener;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.SearchView.OnQueryTextListener;
import android.support.v7.widget.ShareActionProvider;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar ab = this.getSupportActionBar();
ab.setDisplayHomeAsUpEnabled(true);
}
private Intent getMyIntent() {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "主题");
intent.putExtra(Intent.EXTRA_TEXT, "我的文字内容,zhangphil text");
return intent;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
MenuItem searchItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String queryText) {
Toast.makeText(getApplicationContext(), "onQueryTextChange:" + queryText, Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onQueryTextSubmit(String queryText) {
Toast.makeText(getApplicationContext(), "onQueryTextSubmit:" + queryText, Toast.LENGTH_SHORT).show();
return true;
}
});
OnActionExpandListener expandListener = new OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
Toast.makeText(getApplicationContext(), "onMenuItemActionCollapse", Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
Toast.makeText(getApplicationContext(), "onMenuItemActionExpand", Toast.LENGTH_SHORT).show();
return true;
}
};
MenuItemCompat.setOnActionExpandListener(searchItem, expandListener);
MenuItem shareItem = menu.findItem(R.id.share);
ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
shareActionProvider.setShareIntent(getMyIntent());
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.share:
Toast.makeText(getApplicationContext(), "分享", Toast.LENGTH_SHORT).show();
return true;
case R.id.setting:
Toast.makeText(getApplicationContext(), "设置", Toast.LENGTH_SHORT).show();
return true;
case R.id.about:
Toast.makeText(getApplicationContext(), "关于", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
在本例中,MainActivity.java不依赖任何布局文件,只是需要加载menu菜单,所以需要在res/menu/目录下写一个menu菜单的XML文件,定义menu的item,此代码文件在本例中称之为main.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" >
<item
android:id="@+id/search"
android:title="搜索"
app:actionViewapp:showAsAction="ifRoom|collapseActionView"/>
<item
android:id="@+id/share"
android:title="分享"
app:actionProviderapp:showAsAction="ifRoom|withText"/>
<item
android:id="@+id/setting"
android:title="设置"
app:showAsAction="never"/>
<item
android:id="@+id/about"
android:title="关于"
app:showAsAction="ifRoom"/>
</menu>
在MainActivity.java中的一个方法体中,重写:
public boolean onCreateOptionsMenu(Menu menu);
方法将依据res/menu/main.xml文件创建菜单。在这个方法中,为id为search的menu item创建响应搜索事件。同时,附带的为搜索item绑定了展开和收缩事件:
OnActionExpandListener expandListener = new OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
Toast.makeText(getApplicationContext(), "onMenuItemActionCollapse", Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
Toast.makeText(getApplicationContext(), "onMenuItemActionExpand", Toast.LENGTH_SHORT).show();
return true;
}
};
MenuItemCompat.setOnActionExpandListener(searchItem, expandListener);
对于菜单中分享菜单share item,则为其设置了ShareActionProvider,提供分享事件的数据和动作支持:
MenuItem shareItem = menu.findItem(R.id.share);
ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
shareActionProvider.setShareIntent(getMyIntent());
其他次要普通的菜单选择事件则放在
public boolean onOptionsItemSelected(MenuItem item);
中完成。
图1是代码运行后,点击分享icon切换到微信的ActionBar状态:
图2则是点击了搜索item时候的ActionBar状态:
Android NDK C异常引发SIGSEGV和__gnu_cxx :: __ verbose_terminate_handler
我想在我的JNI代码中抛出std :: exception的子类,该代码使用swig进行了包装,但由于生成的代码非常简单,因此它实际上并不相关:
void function_that_throws_exception() {
...
throw MyNativeException("Error");
}
try {
function_that_throws_exception();
} catch(MyNativeException &_e) {
jclass excep = jenv->FindClass("x/y/zMyNativeException");
if (excep)
jenv->ThrowNew(excep, (&_e)->what());
return 0;
}
我在标志中添加了-fexception,但是当用户代码引发异常时,vm仍然中止,catch块中的代码未执行.
我测试了不同的cpp实现,gnustl_static引发了__gnu_cxx :: __ verbose_terminate_handler,看起来异常未处理,
stlport_static调用abort()
标志:
在Android.mk中:
LOCAL_CPP_FEATURES =例外
在Application.mk中:
APP_CPPFLAGS = -fexceptions
APP_CFLAGS = -fexceptions
我也尝试过强制重建stlport和libcxx,并使用gcc-4.6,gcc-4.8和clang
更新
即使这个简单的代码也会中止
try
{
throw new std::exception();
} catch (std::exception &e) {
}
如果我使用std :: set_terminate设置了终止函数,我的函数将被调用,显然无法捕获
更新
没有“ new”的简单代码确实有效,因此我怀疑我的异常出了点问题:
class MyNativeException : public std::exception
{
public:
explicit MyNativeException(const char *msg) : message(msg) {}
virtual ~MyNativeException() throw() {}
virtual const char *what() const throw() { return message.c_str(); }
protected:
const std::string message;
};
我用它扔:
抛出MyNativeException(“ message”)
更新
好的,此异常定义确实起作用:
class MyNativeException
{
public:
MyNativeException(const char *msg) : message(msg) {}
~MyNativeException() {}
const char *what() { return message.c_str(); }
private:
const std::string message;
};
以前有什么问题?
解决方法:
您的问题与C与Java混淆有关.
抛出新的std :: exception();
上面的那一行在Java中可能很好,但是在C中则是另一回事.
>您正在从免费存储区中分配内存以创建对象.
>但最重要的是,C语言中的new函数返回一个指针,该指针指向必须使用delete释放的动态分配的内存.它与Java中的新增功能不同.
因此,C语言中的那一行代码将抛出一个指针值,而不是一个对象.不幸的是,您没有检测到此问题,因为在C中您几乎可以抛出任何东西-std :: exception对象,int,指针值等.
如果您有一个捕获指针值的catch块,那么您将看到此内容.
例如:
try
{
throw new std::exception();
}
catch (std::exception *e)
{
delete e;
}
但是要轻松纠正您的尝试,请执行以下操作:
try
{
throw std::exception();
}
catch (std::exception &e)
{
}
确认一下,这是一个很小的完整程序,会引发异常并捕获此异常:
#include <exception>
#include <string>
#include <iostream>
class MyNativeException : public std::exception
{
public:
explicit MyNativeException(const char *msg) : message(msg) {}
virtual ~MyNativeException() throw() {}
virtual const char *what() const throw() { return message.c_str(); }
protected:
const std::string message;
};
int main()
{
try
{
throw MyNativeException("abc123");
}
catch (std::exception& e)
{
std::cout << e.what();
}
}
输出:
abc123
我参加了您的课程,实际上抛出了您声称没有被捕获的异常.上面代码中的异常确实被捕获,因此,您遇到的问题的唯一结论是您要么
>不抛出您声称正在抛出的异常,或者
>您错误地抛出了它(如new问题所指出的那样),或者
>您的编译器已损坏,或者您需要设置一个开关来启用异常处理.
Android NDK UnsatisfiedLinkError:“dlopen失败:空/丢失DT_HASH”
我正在使用崩溃报告服务跟踪我们的Android应用程序(使用NDK加载C库)的崩溃.少数用户遇到以下崩溃:
java.lang.UnsatisfiedLinkError: dlopen Failed: empty/missing DT_HASH in "cpplibrary.so" (built with --hash-style=gnu?)
at java.lang.Runtime.loadLibrary(Runtime.java:365)
at java.lang.System.loadLibrary(System.java:526)
我可以在互联网上找到的这个错误提及(例如这个Google Groups post)讨论了构建lib的问题,这会导致每次运行应用程序时都会出现此错误.几乎没有关于为什么偶尔会发生这种情况的信息. This post是我能找到的最接近的.
根据崩溃痕迹,看起来任何特定的用户都会经历这种不断的延伸;我不确定这些用户是否能够正确加载lib.有没有人对有时可能导致这种情况发生的想法有所了解?我可以以不同的方式进行NDK构建以试图阻止它吗?
谢谢!
编辑:This post提到了有条件地获得此类错误的两种方法;我会照顾他们.
Edit2:构建文件:
Android.mk(摘录):
include $(CLEAR_VARS)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
LOCAL_C_INCLUDES :=
Application.mk:
APP_STL := stlport_static
APP_CFLAGS += -std=c++11
最佳答案
如果您是第三方构建.so库供其他人使用,设置-Wl,– hash-style =两者似乎都是最好的主意.这样可以加快Gnu样式哈希的加载速度和SysV哈希的向后兼容性.
关于使用hash_map时,我在android NDK上遇到了complition错误_GLIBCXX_PERMIT_BACKWARD_HASH的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Android ''showAsAction'' in package ''android''错误解决、Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu、Android NDK C异常引发SIGSEGV和__gnu_cxx :: __ verbose_terminate_handler、Android NDK UnsatisfiedLinkError:“dlopen失败:空/丢失DT_HASH”等相关内容,可以在本站寻找。
本文标签: