ndk源码
① android ndk编译C源码~ld提示mblen()无法链接怎么办undefined reference to 'mblen'
不制动啊,这个唯难题是我不懂的
② Android用NDK和整套源码下编译JNI的不同
NDK:
1、包含头文件
#include <android/log.h>
2、Android.mk中包含库
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
上面这个一定要,不然出现error: undefined reference to '__android_log_print'
LOCAL_SHARED_LIBRARIES := libdl\
liblog\ #经测试在Eclipse中用NDK编译可有可无,没啥用!但在源码中就必须是他,所以都加上吧!
libpre_AppUpgrade\
libpre_AppArea\
3、在你的jni文件中定义
#define LOGD() __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) // 定义LOGD类型
#define LOGI() __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) // 定义LOGI类型
#define LOGW() __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__) // 定义LOGW类型
#define LOGE() __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) // 定义LOGE类型
#define LOGF() __android_log_print(ANDROID_LOG_FATAL,LOG_TAG,__VA_ARGS__) // 定义LOGF类型
adnroid4.2源码中已经将LOGD等都加了一个头,
#define ALOGD() __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__) // 定义LOGD类型
#define ALOGI() __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) // 定义LOGI类型
#define ALOGW() __android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__) // 定义LOGW类型
#define ALOGE() __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) // 定义LOGE类型
#define ALOGF() __android_log_print(ANDROID_LOG_FATAL,LOG_TAG,__VA_ARGS__) // 定义LOGF类型
注意如果你不想在每一个jni文件中都定义上述宏,投机方法即可以定义在:D:\android-ndk-r9d\platforms\android-19\arch-arm\usr\include\android\log.h中!当然这种编译也只能在你本机上使用啦~
源码开发:
1、Android.mk中包含库
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
LOCAL_SHARED_LIBRARIES := libdl\
liblog\ //源码中开发一定的加上
libpre_AppUpgrade\
libpre_AppArea\
2、包含头文件#include <utils/Log.h>
3、注意在使用时记得包含库的头文件
转载
③ 如何解决android ndk r8c 老是重新编译源代码的问题
ndk编译是针对jni的。jni是java native interface的缩写,意为java本地接口。 java本地接口一般是用c语言来实现一些功能,然后通过特定的格式暴露接口给java调用。但是C语言的代码不能直接被java使用,而是需要通过ndk进行编译,编译后会在libs目录下生成.so文件,这事动态运行库,这时C语言曝露出的接口才能被java调用。 楼主可以检查你的vlc项目中的libs目录下,是否包含了.so文件,如果有的话一般是不需要ndk进行 编译的。不过如果楼主修改了c语言中的代码,那么为了使修改生效必须从新用ndk编译,编译后会删除原来生成的.so,并生成新的.so文件。 使用ndk-r7以及更高版本的ndk,可以免安装cygwin而直接使用命令行进行编译,非常方便。 方法: 将ndk的根目录设置环境变量,然后dos命令行进入需要编译的项目的根目录,执行命令 ndk-build
④ linux下 如何用NDK生成C语言动态库
先将要编译的源代码文件移动到一个目录下面,写好makefile文件,一般是已经写好的(没有的话就要自己写了),然后配置好ndk环境变量,在/etc/profile目录下添加export NDK_ROOT=/你的nkd路径,然后保存,重启机器,最后就是cd到你要编译的源码目录下,调用ndk_build就行了
⑤ 在哪可以看到NDK下gnu-libstdc++库的源代码
概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的。 3. 便于移植,用C/C++写的库可以方便在其他的嵌入式平
⑥ Android用NDK和整套源码下编译JNI的不同
问题描述的不清楚,不觉明理,ndk的问题还是建议到ndk吧去反馈,
我是ndk吧吧主,有问题可以到ndk吧留言,谢谢!
⑦ 最近在研究JNI和NDK。现有C++源码,要求通过JNI,JAVA能调用C++源码的功能,该怎么来实现
自己看,我懒得贴了
http://www.myext.cn/android/33060.html
⑧ Android用NDK和整套源码下编译JNI的不同
2. 注册函数的方法是不同的。举例说,在com/evan129/jnitest/jniutils.java有个native int foo()方法,需要在jni中实现
在ndk中,只要实现这个函数,然后函数名是以jint java_com_evan129_jnitest_jniutils_foo(jnienv* env, jobject thiz) 命名既可。也就是说,如果jni只要实现这个函数,并且功能也很简单的话,那么jni c/cpp文件里只需要这一个函数就完事了。
但在android源码中编译jni代码是不同的,jni中的函数名无所谓。不过至少还需要加一个
jniexport jint jnicall jni_onload(javavm* vm, void* reserved)方法,这个方法可以找个现有的复制一把就行,检查运行环境的。然后主要是这个方法中会调用(*env).registernatives函数,在这里把jni中的方法和java文件中的方法关联起来。
3. 有个很诡异的区别,自动传入的jnienv* env好像不是一个东西。因为在android源码中使用这个env一般是如env->newstringutf(…),而ndk中sample里的一处是(*env)->newstringutf(…) 这env和*env差很大。但两处函数传入的都是jnienv* env,只能怀疑jnienv的定义是不是都是不同的。
⑨ Android studio怎么关联NDK源码
NDK算是一个插件,安装以后可以在AS上面开发C C++,如果关联这个插件呢