NDK开发的2个问题。高分求高手来解决。

绝世酱油瓶 2013-06-25 05:30:39
①我在项目中引用了第三方的C库,以源码形式引用的。
在我JNI的C文件中已经引入了第三方的头文件。然后通过NDK编译的时候,使用到的第三方库的函数提示未定义。
此时的mk文件写法:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := EmvHandler
LOCAL_SRC_FILES := EmvHandler.c

include $(BUILD_SHARED_LIBRARY)

后来在网上查,说在mk里也需要引入使用到的头文件的路径,于是修改为:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := EmvHandler
LOCAL_SRC_FILES := EmvHandler.c\
EmvLib_Api.h

include $(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 这个怎么写啊?
...全文
135 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
小听风 2013-06-26
  • 打赏
  • 举报
回复
你要写两个Android.mk 一个是在你的jni下,一个是在第三方源码下: 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
绝世酱油瓶 2013-06-26
  • 打赏
  • 举报
回复
引用 6 楼 guoyoulei520 的回复:
LOCAL_SHARED_LIBRARIES := libc libcutils libcrypto libssl libkeystore_binder 这是引用第三方库的例子
直接引用C文件和头文件这种形式可以吗
凉凉二点凉 2013-06-26
  • 打赏
  • 举报
回复
LOCAL_SHARED_LIBRARIES := libc libcutils libcrypto libssl libkeystore_binder 这是引用第三方库的例子
mmorss 2013-06-26
  • 打赏
  • 举报
回复
引用 8 楼 GuoQun01 的回复:
你要写两个Android.mk 一个是在你的jni下,一个是在第三方源码下: 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
我分数100多了,哈哈
绝世酱油瓶 2013-06-25
  • 打赏
  • 举报
回复
引用 4 楼 jerry_dqh 的回复:
MAKE中的LOCAL_SRC_FILE不对,怎么是EmvHandler.c\EmvHandler.h EmvHandler.h 不要放在soruce这个里面 ,放到include里面。
在我JNI的C文件中已经引入了第三方的头文件我已经说了我include过头文件了、但是仅仅在C文件中include,NDK编译根本通不过,引入的头文件里的函数都显示undefined references。你写过这种引用第三方C的工程没???
碼上道 2013-06-25
  • 打赏
  • 举报
回复
MAKE中的LOCAL_SRC_FILE不对,怎么是EmvHandler.c\EmvHandler.h EmvHandler.h 不要放在soruce这个里面 ,放到include里面。
绝世酱油瓶 2013-06-25
  • 打赏
  • 举报
回复
引用 2 楼 guoyoulei520 的回复:
你第三方的库是.a还是.so
我都说了是以源码形式引用的。引用的C文件和头文件
凉凉二点凉 2013-06-25
  • 打赏
  • 举报
回复
你第三方的库是.a还是.so
西热力江 2013-06-25
  • 打赏
  • 举报
回复
NDK里不是有例子教程吗?可以参考下

80,353

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧