我正在调查崩溃的程序,但无法在Visual Studio 2013中加载本机映像DLL的符号.该应用程序是32位并使用.NET 4.0.30319.我通过从模块窗口检查加载到进程中的clr.dll版本来确认这一点.同样从模块窗口,我检查了加载mscorlib.ni.dll的位置:
clr.dll C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
mscorlib.ni.dll C:\Windows\assembly\NativeImages_v4.0.30319_32\mscorlib\ce5f61c5754789df97be8dc991c47d07\mscorlib.ni.dll
Run Code Online (Sandbox Code Playgroud)
我能够成功生成mscorlib.ni.dll的PDB:
但是当我尝试通过右键单击mscorlib.ni.dll的堆栈框架并选择加载符号将其加载到VS 2013中时,我收到一条消息,上面写着"在此文件夹中找不到匹配的符号文件".
我看了看:
创建用于分析报告的Ngen Pdbs / 并遵循生成PDB的简单指令,因为我只想在此时看到函数调用,
如何获取mscorlib.ni.lib的PDB文件(.Net Framework 3.5)
看起来最常见的错误来源是选择正确的位数.我从模块选项卡中知道我正在加载mscorlib.ni.dll的32位变体,再次从我的屏幕截图中,你可以看到我使用的是相同版本的.NET框架和32位版本的Ngen.exe.我为WindowsBase.ni.dll尝试了这个,并且看到了我成功生成PDB但无法加载它的相同行为.
我已启用调试器以及时调试托管和本机代码.
问题:
谢谢!
使用ReSharper从Visual Studio 2008中调试NUnit测试时,是否可以将ReSharper测试运行器附加到本机代码调试器?默认情况下,它仅附加Visual Studio托管调试器.
好的,所以我有下面的本机代码.我试图从它返回一个FilePermissionInfo数组,填充stat()返回的一些数据.问题是我第一次调用NewObject时出现以下错误:
06-15 20:25:17.621:W/dalvikvm(2287):decodeIndirectRef中的无效间接引用0x40005820 06-15 20:25:17.621:E/dalvikvm(2287):VM中止
这很奇怪,因为我唯一的参考对象是jclass(对于FilePermissionInfo),我把它变成了一个全局引用.
代码是:
JNIEXPORT jobjectArray JNICALL
Java_com_mn_rootscape_utils_NativeMethods_getFilesPermissions( JNIEnv* env, jobject thizz, jobjectArray filePathsArray )
{
jobjectArray result;
int size = (*env)->GetArrayLength(env, filePathsArray);
jboolean isCopy;
jclass filePermInfoCls = (*env)->FindClass(env, kFilePermissionInfoPath);
if(!filePermInfoCls)
{
LOGE("getFilesPermissions: failed to get class reference.");
return NULL;
}
gFilePermInfoClass = (jclass)(*env)->NewGlobalRef(env, filePermInfoCls);
LOGI("got gFilePermInfoClass");
jmethodID filePermInfoClsConstructor = (*env)->GetMethodID(env, gFilePermInfoClass, "<init>", kFilePermInfoConstructorSig);
if(!filePermInfoClsConstructor)
{
LOGE("getFilesPermissions: failed to get method reference.");
return NULL;
}
struct stat sb;
LOGI("starting...");
result = (jobjectArray)(*env)->NewObjectArray(env, size, gFilePermInfoClass, NULL);
for(int i …Run Code Online (Sandbox Code Playgroud) android native-code android-ndk android-4.0-ice-cream-sandwich
我在Java程序中使用本机C++库.编写Java程序是为了利用多核系统,但它不能扩展:最佳速度是大约6个核心,即添加更多核心会降低它的速度.我的测试表明,对本机代码本身的调用会导致问题,所以我想确保不同的线程访问本机库的不同实例,从而删除并行任务之间的任何隐藏(内存)依赖关系.换句话说,而不是静态块
static {
System.loadLibrary("theNativeLib");
}
Run Code Online (Sandbox Code Playgroud)
我希望动态地为每个线程加载库的多个实例.主要问题是,这是否可行.然后怎么做!
注意: - 我在Java 7 fork/join以及Scala/akka中实现了.所以对每个平台的任何帮助表示赞赏. - 并行任务完全独立.实际上,每个任务可能会创建一些新任务然后终止; 没有进一步的依赖
这是fork/join样式的测试程序,其中processNative基本上是一堆本机调用:
class Repeater extends RecursiveTask<Long> {
final int n;
final processor mol;
public Repeater(final int m, final processor o) {
n=m;
mol = o;
}
@Override
protected Long compute() {
processNatively(mol);
final List<RecursiveTask<Long>> tasks = new ArrayList<>();
for (int i=n; i<9; i++) {
tasks.add(new Repeater(n+1,mol));
}
long count = 1;
for(final RecursiveTask<Long> task : invokeAll(tasks)) {
count += task.join();
}
return count;
}
} …Run Code Online (Sandbox Code Playgroud) 我的应用程序完全用C/C++编写NativeActivity,它没有Java代码(基于"本机活动"NDK示例).按"后退"按钮将其关闭(破坏活动),但我需要此按钮的其他行为,因为我有自己的UI和通过OpenGL显示的菜单.
在我读到的时候,为了改变"后退"按钮的行为,我需要覆盖onBackPressed()Java活动类的方法.但我不使用Java,我可以从C/C++中获取此方法来覆盖它吗?
如果没有,是否有其他方法使用NDK处理"后退"按钮,没有Java代码?
我需要在本机代码(c语言代码)和Android代码之间创建回调.我编写了JNI函数,用于C code从这样的android 调用
JNI代码在这里
#include <android/log.h>
void initSocket();
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_org_pjsip_pjsua_pjsua_1appJNI_initSocket(JNIEnv *jenv, jclass jcls) {
__android_log_write(ANDROID_LOG_INFO, " JNI CODE ", " APP INIT SOCKET");
initSocket();
}
}
Run Code Online (Sandbox Code Playgroud)
C代码看起来像这样
void initSocket()
{
/// some more stuff
printf(" initSocket function ");
}
static int worker_thread(void *unused)
{
/// some more stuff
return 0;
}
pj_bool_t on_rx_data1(pj_stun_sock *stun_sock, void *pkt, unsigned pkt_len, const pj_sockaddr_t *src_addr, unsigned addr_len)
{
/// some more stuff
return PJ_TRUE; …Run Code Online (Sandbox Code Playgroud) 我需要在我的Codename One应用程序中插入本机代码.我是iOS编程的全新手,所以我需要学习Objective-C.但是我读到Swift是Objective-C的继承者,我觉得Swift语法更舒服.但我不知道是否在Codename One中支持Swift.在查看由Codename One生成的iOS源代码时,虽然我不是100%肯定,但它看起来像C代码(我可能错了).
在他的博客上,Shannah(来自Codename One)写道
Codename One目前将所有内容编译为普通的旧C代码,因此我们在很大程度上不会受到这种更改的影响 - 尽管会有一些本机部分使用需要更新的Objective-C.幸运的是,如果您是Codename One用户,则无需关注这些细节,因为您使用的是Java.
我不清楚这就是为什么我在询问是否可以在Codename One本机代码中使用Swift代码?
非常感谢帮助我澄清这个话题!
干杯
我正在为 ios 构建我的 npm 包,使用本机模块,因为我需要使用第三方框架,该包已发布并且一切正常,安装到我的应用程序中,但是当我即将从 IOS 渲染本机视图到 RN 时出现错误, IOS端如下:
这是我的 CounterViewManager.swift:
import Foundation
@objc(CounterViewManager)
class CounterViewManager: RCTViewManager {
override func view() -> UIView! {
let label = UILabel()
label.text = "Swift Counter"
label.textAlignment = .center
return label
}
}
Run Code Online (Sandbox Code Playgroud)
我的 CounterViewManager.m:
#import <Foundation/Foundation.h>
#import "React/RCTViewManager.h"
@interface RCT_EXTERN_MODULE(CounterViewManager, RCTViewManager)
@end
Run Code Online (Sandbox Code Playgroud)
这就是我从 RN 导入它的方式:
import { requireNativeComponent } from 'react-native';
const MyViewManager = requireNativeComponent('CounterView');
export const Test = () => {
return (
<MyViewManager></MyViewManager>
)
}
Run Code Online (Sandbox Code Playgroud)
在 RN 中我使用CounterView,因为 …
用于编译本机代码的 NDK 版本与安装 APK 的设备上运行的 Android 版本之间是否存在任何关系(约束/兼容性限制)?
例如,我使用Android NDK r7编译本机代码,获取库并生成APK1;然后我用 NDK r10d 编译,获取库并生成 APK2。
在同一设备上运行的 APK1 和 APK2 之间是否有可能出现不同的行为?
我已经在stackoverflow上阅读了一些相关答案,但似乎没有人回答我的问题。我将从本机代码中获取android ID,即在C代码中调用方法getAndroidIDfromNativeCode,(因此JVM通过方法在本机代码中初始化create_vm),大家知道在调用getContentResolver方法时,必须使用一个Android Context实例来调用,那么如何获取这个Context实例呢?
static jstring
native_code_getAndroidID(JNIEnv *env, jobject thiz)
{
jclass c_settings_secure = (*env)->FindClass(env, "android/provider/Settings$Secure");
jclass c_context = (*env)->FindClass(env,"android/content/Context");
if(c_settings_secure == NULL || c_context == NULL){
return NULL;
}
//Get the getContentResolver method
jmethodID m_get_content_resolver = (*env)->GetMethodID(env, c_context, "getContentResolver",
"()Landroid/content/ContentResolver;");
if(m_get_content_resolver == NULL){
return NULL;
}
//Get the Settings.Secure.ANDROID_ID constant
jfieldID f_android_id = (*env)->GetStaticFieldID(env, c_settings_secure, "ANDROID_ID", "Ljava/lang/String;");
if(f_android_id == NULL){
return NULL;
}
jstring s_android_id = (*env)->GetStaticObjectField(env, c_settings_secure, f_android_id);
//create a ContentResolver instance context.getContentResolver() …Run Code Online (Sandbox Code Playgroud) native-code ×10
android ×5
android-ndk ×4
debugging ×2
ios ×2
java ×2
android-4.0-ice-cream-sandwich ×1
build ×1
codenameone ×1
multicore ×1
ngen ×1
npm ×1
nunit ×1
pdb ×1
react-native ×1
resharper ×1
scalability ×1
swift ×1