2016-07-11 12 views
0

私は現在OP-TEEをオープンソースの信頼実行環境であるAndroid側で使用しようとしています。私はJNIインターフェイスを使用する必要があります。AndroidでJNIを使​​用しようとしましたが、私のCプログラムで定義されていない参照を取得しました

Cファイル:

のAndroid Studioでの私の現在のCプログラムは、OP-TEEのためのC言語で書かれたhello_worldの一例であり、私は単純にhello_world.c例から共有ライブラリを構築しようとしています:

#include<jni.h> 
#include<string.h> 
#include <err.h> 
#include "tee_client_api.h" 
#include "ta_hello_world.h" 
#include <stdio.h> 

jstring Java_com_example_jsherman_ndktest_MainActivity_helloWorld(JNIEnv* env,jobject obj){ 

    TEEC_Result res; 
    TEEC_Context ctx; 
    TEEC_Session sess; 
    TEEC_Operation op; 
    TEEC_UUID uuid = TA_HELLO_WORLD_UUID; 
    uint32_t err_origin; 

    /* Initialize a context connecting us to the TEE */ 
    res = TEEC_InitializeContext(NULL, &ctx); 
    if (res != TEEC_SUCCESS) 
     errx(1, "TEEC_InitializeContext failed with code 0x%x", res); 

    /* 
    * Open a session to the "hello world" TA, the TA will print "hello 
    * world!" in the log when the session is created. 
    */ 
    res = TEEC_OpenSession(&ctx, &sess, &uuid, 
        TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin); 
    if (res != TEEC_SUCCESS) 
     errx(1, "TEEC_Opensession failed with code 0x%x origin 0x%x", 
      res, err_origin); 

    /* 
    * Execute a function in the TA by invoking it, in this case 
    * we're incrementing a number. 
    * 
    * The value of command ID part and how the parameters are 
    * interpreted is part of the interface provided by the TA. 
    */ 

    /* 
    * Prepare the argument. Pass a value in the first parameter, 
    * the remaining three parameters are unused. 
    */ 
    memset(&op, 0, sizeof(op)); 
    op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE, 
        TEEC_NONE, TEEC_NONE); 
    op.params[0].value.a = 42; 

    printf("Invoking TA to increment %d\n", op.params[0].value.a); 
    res = TEEC_InvokeCommand(&sess, TA_HELLO_WORLD_CMD_INC_VALUE, &op, 
       &err_origin); 
    if (res != TEEC_SUCCESS) 
     errx(1, "TEEC_InvokeCommand failed with code 0x%x origin 0x%x", 
      res, err_origin); 
    printf("TA incremented value to %d\n", op.params[0].value.a); 

    /* 
    * We're done with the TA, close the session and 
    * destroy the context. 
    * 
    * The TA will print "Goodbye!" in the log when the 
    * session is closed. 
    */ 

    TEEC_CloseSession(&sess); 

    TEEC_FinalizeContext(&ctx); 

    return (*env)->NewStringUTF(env,"Hello world"); 
} 

Android.mkファイル:何らかの理由で

################################################################################ 
# Android optee-hello-world makefile           # 
################################################################################ 

LOCAL_PATH := $(call my-dir) 
CFG_TEEC_PUBLIC_INCLUDE = /home/jsherman/devel/optee/optee_client/public 

################################################################################ 
# Build hello world               # 
################################################################################ 
include $(CLEAR_VARS) 


LOCAL_C_INCLUDES := /home/jsherman/devel/optee/optee_hello_world/ta/include \ 
     $(CFG_TEEC_PUBLIC_INCLUDE) \ 

$(info $(LOCAL_C_INCLUDES)) 

LOCAL_SHARED_LIBRARIES := libteec 

LOCAL_MODULE := ndktest 
LOCAL_SRC_FILES := ndktest.c 

include $(BUILD_SHARED_LIBRARY) 

、私は取得していますエラー:

/home/jsherman/AndroidStudioProjects/NDKTest/jni/ndktest.c:18: undefined reference to `TEEC_InitializeContext' 
/home/jsherman/AndroidStudioProjects/NDKTest/jni/ndktest.c:26: undefined reference to `TEEC_OpenSession' 
/home/jsherman/AndroidStudioProjects/NDKTest/jni/ndktest.c:50: undefined reference to `TEEC_InvokeCommand' 
/home/jsherman/AndroidStudioProjects/NDKTest/jni/ndktest.c:65: undefined reference to `TEEC_CloseSession' 
/home/jsherman/AndroidStudioProjects/NDKTest/jni/ndktest.c:67: undefined reference to `TEEC_FinalizeContext' 

これらのデータ構造が定義されているtee_client_api.hがあるLOCAL_C_INCLUDES変数の正しいディレクトリを参照しているため、このエラーが発生する理由について混乱しています。あなたはPREBUILT_SHARED_LIBRARYブロックとバイナリの場所について教えなければなりませんので、

答えて

0

OP-TEEは、非プラットフォームライブラリです:私は、事前構築された共有ライブラリを参照しようとしている場合

include $(CLEAR_VARS) 
LOCAL_MODULE := libteec 
LOCAL_SRC_FILES := <path_to_libteec_so> 
include $(PREBUILT_SHARED_LIBRARY) 
+0

は本当、このですか? –

関連する問題