C++ nm实用程序获取中定义的内容。因此文件返回错误
我需要在.so文件中定义符号。我使用最新的Mac OS,我会这样做:C++ nm实用程序获取中定义的内容。因此文件返回错误,c++,macos,shared-libraries,nm,C++,Macos,Shared Libraries,Nm,我需要在.so文件中定义符号。我使用最新的Mac OS,我会这样做: /usr/bin/nm -gC libs/armeabi/libhello.so 错误:/Applications/Xcode.app/Contents/Developer/toolschains/Xcode默认值.xctoolschain/usr/bin/nm:无效参数-C 用法:/Applications/Xcode.app/Contents/Developer/toolschains/XcodeDefault.x
/usr/bin/nm -gC libs/armeabi/libhello.so
错误:/Applications/Xcode.app/Contents/Developer/toolschains/Xcode默认值.xctoolschain/usr/bin/nm:无效参数-C
用法:/Applications/Xcode.app/Contents/Developer/toolschains/XcodeDefault.xctoolschain/usr/bin/nm[-agnopruUmxjlfAP[s segname sectname][-][-t格式][[-arch]…][file…]
据我所知,这是另一个nm实用程序?它与XCode连接?如何解决此问题
编辑:添加用于创建.so文件的代码
#include <android/log.h>
#include <stdio.h>
#include <jni.h>
jint NativeAddition(JNIEnv *pEnv, jobject pObj, jint pa, jint pb)
{
return pa+pb;
}
jint NativeMultiplication(JNIEnv *pEnv, jobject pObj, jint pa,
jint pb) {
return pa*pb;
}
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* pVm, void* reserved)
{
JNIEnv* env;
if ((*pVm)->GetEnv(pVm, (void **)&env, JNI_VERSION_1_6)) {
return -1; }
JNINativeMethod nm[2];
nm[0].name = "NativeAddition";
nm[0].signature = "(II)I";
nm[0].fnPtr = NativeAddition;
nm[1].name = "NativeMultiplication";
nm[1].signature = "(II)I";
nm[1].fnPtr = NativeMultiplication;
jclass cls = (*env)->FindClass(env, "com/example/hellondk/HelloNDKActivity");
// Register methods with env->RegisterNatives.
(*env)->RegisterNatives(env, cls, nm, 2);
return JNI_VERSION_1_6;
}
#包括
#包括
#包括
jint NativeAddition(JNIEnv*pEnv、jobject pObj、jint pa、jint pb)
{
返回pa+pb;
}
jint NativeMultiplication(JNIEnv*pEnv,jobject pObj,jint pa,
金特(铅){
返回pa*pb;
}
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM*pVm,void*reserved)
{
JNIEnv*env;
if((*pVm)->GetEnv(pVm,(void**)和env,JNI_版本1_6)){
返回-1;}
jniationalmethodnm[2];
nm[0]。name=“NativeAddition”;
nm[0]。签名=“(II)I”;
nm[0].fnPtr=NativeAddition;
nm[1]。name=“NativeMultiplication”;
nm[1]。签名=“(II)I”;
nm[1],fnPtr=native乘法;
jclass cls=(*env)->FindClass(env,“com/example/hellondk/HelloNDKActivity”);
//使用env->RegisterNatives注册方法。
(*env)->注册号(env、cls、nm、2);
返回JNI_版本_1_6;
}
此示例来自Android本机开发工具包Cookbook
这里还有我的nm
用法:
/Applications/Xcode.app/Contents/Developer/toolschains/XcodeDefault.xctoolschain/usr/bin/nm
[-agnoprouumxjlfap[s segname sectname][-][-t格式][[-arch
]…][文件…]
安装macports,然后使用macports运行
端口安装binutils
最后,在OSX中运行
gobjdump-p app
,不存在用于请求符号的-C
选项
# nm libs/armeabi/libhello.so | c++filt -p -i
您可以改为或调用它,如上所示。我有一个.so文件,它只包含两个函数。当我编写§nm-g libhello.so§时,它不打印任何内容。因此,它在管道后不打印任何内容。删除
-g
选项:)再次不打印任何内容。什么是-g选项?这有关系吗。那么文件是为JNI编写的?@Narek,the -g
选项将仅显示全局(外部)符号(主要用于DYLIB等)。您可能需要安装c++filt
,尽管它通常包含在XCode命令行工具中-哪个c++filt的输出是什么?我在这里有这个工具:/usr/bin/c++filt
。问题是nm libs/armeabi/libhello。所以不打印任何内容。在这种情况下,我应该不使用任何内容通过管道连接到c++filt
,显然,它不应该打印任何内容。