①我在项目中引用了第三方的C库,以源码形式引用的。
在我JNI的C文件中已经引入了第三方的头文件。然后通过NDK编译的时候,使用到的第三方库的函数提示未定义。
此时的mk文件写法:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := EmvHandler
LOCAL_SRC_FILES := EmvHandler.cinclude $(BUILD_SHARED_LIBRARY)
后来在网上查,说在mk里也需要引入使用到的头文件的路径,于是修改为:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := EmvHandler
LOCAL_SRC_FILES := EmvHandler.c\
EmvLib_Api.hinclude $(BUILD_SHARED_LIBRARY)但是这样编译提示这样编译应该没成功,虽然没提示具体错误,但是android程序运行报错了。请问这种在JNI的C文件中引用了第三方库的情况,mk文件倒底该怎么写?或是其它需要注意的地方?
②第三方的库中有很多结构体。我这里举个例
typedef struct {
unsigned char RID[5];
unsigned char KeyID;
unsigned long HashInd;
}EMV_TEST;
第三方库中有个函数返回这个结构体,然后我在JNI的C中需要获取这个结构体里面每个属性的值,并赋值到一个jstring。获取结构体单个属性并转为jstring 这个怎么写啊?
在我JNI的C文件中已经引入了第三方的头文件。然后通过NDK编译的时候,使用到的第三方库的函数提示未定义。
此时的mk文件写法:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := EmvHandler
LOCAL_SRC_FILES := EmvHandler.cinclude $(BUILD_SHARED_LIBRARY)
后来在网上查,说在mk里也需要引入使用到的头文件的路径,于是修改为:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := EmvHandler
LOCAL_SRC_FILES := EmvHandler.c\
EmvLib_Api.hinclude $(BUILD_SHARED_LIBRARY)但是这样编译提示这样编译应该没成功,虽然没提示具体错误,但是android程序运行报错了。请问这种在JNI的C文件中引用了第三方库的情况,mk文件倒底该怎么写?或是其它需要注意的地方?
②第三方的库中有很多结构体。我这里举个例
typedef struct {
unsigned char RID[5];
unsigned char KeyID;
unsigned long HashInd;
}EMV_TEST;
第三方库中有个函数返回这个结构体,然后我在JNI的C中需要获取这个结构体里面每个属性的值,并赋值到一个jstring。获取结构体单个属性并转为jstring 这个怎么写啊?
解决方案 »
- 如何在WebView中通过Java传递给JS数组
- 怎样在代码中把framelayout里的某一层放到最顶层
- 求助,android开发的google map 只显示小格子
- 谁有《大话企业级Android应用开发实战》(王家林)第六章的代码?发到我:一丝一一二八五灵司令QQ邮箱
- android sina 微博分享 认证错误
- 关于repo sync 同步Android源码的问题
- 不用webview可以进行javascript和java代码交互吗?
- 手机软件开发运行在Android系统上,用什么开发工具好
- android 4.4菜单拖动卡顿的问题
- 加载layout时出现问题,求解惑
- android多点触摸实例代码的一点疑问
- webview的getProgress()方法在loadString时,百分比还会那么明显吗?
这是引用第三方库的例子
1\你jni下面的Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := EmvHandler
LOCAL_SRC_FILES := EmvHandler.c
LOCAL_C_INCLUDES := EmvLib_Api.h \
$(LOCAL_PATH)/include/ #这个LOCAL_PATH表示当前Android.mk所在的当前目录,这句话说将当前目录include下的所有.h文件包含进来
LOCAL_SHARED_LIBRARIES := liblog libcutils libthird #libthird 是你要链接的第三方库,暂时取名为 libthird。
LOCAL_LDLIBS +=-L$(LOCAL_PATH) -lm -llog
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))1、你第三方库的Android.mk,这个你可以拿出来使用ndk单独编译,将Android.mk置于代码的顶层目录:
#编译第三方库,这个会生成libthird.so文件,供你的jni链接
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libthird
LOCAL_SRC_FILES := xx.c \
xxx.c \
$(LOCAL_PATH)/src/ #src下面的所有源文件
LOCAL_C_INCLUDES := xx.h \
xxx.h \
$(LOCAL_PATH)/include/ #这个LOCAL_PATH表示当前Android.mk所在的当前目录,这句话说将当前目录include下的所有.h文件包含进来
LOCAL_SHARED_LIBRARIES := liblog libcutils
LOCAL_LDLIBS +=-L$(LOCAL_PATH) -lm -llog
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))
3。如果你想将一个int或long转成 jstring:
char buffer[20];
sprintf(buffer,"%d",value);
jstring string = (*env)->NewStringUTF(env, buffer);如果有帮助,把分数给我把,我的分数都空了。
有疑问可以互相讨论:qq :378983706